[bzoj 1968][Ahoi2005]COMMON 约数研究

1到n约数之和题解思路
该博客是一道题的题解,题目求1到n中每个数的约数之和。解题思路是换个角度,考虑1到n中每个数对答案的贡献,即其在n以内的倍数个数,每个数的贡献为n/i(向下取整),可O(n)扫一遍,还有O(2√n)做法。

Description

Input

只有一行一个整数 N(0 < N < 1000000)。

Output

只有一行输出,为整数M,即f(1)到f(N)的累加和。

Sample Input

3

Sample Output

5

题解

水题一道...不过思路还是比较难想的

这题求的是1到n中的每个数的约数之和

我们可以换一个方面来想,对于1到n的每个数,它对答案的贡献是多少,也就是说,它有多少个倍数在n以内

所以每个数对答案的贡献就是$n/i$(这里的除法是向下取整的)

$O(n)$扫一遍就行

据说还有$O(2\sqrt{n})$的做法

#include <bits/stdc++.h>

using namespace std;

int n;
long long ans=0;

int main(){
    scanf("%d",&n);
    
    for(int i=1;i<=n;i++)
        ans+=n/i;

    printf("%lld\n",ans);
    return 0;
}

 

转载于:https://www.cnblogs.com/henry-1202/p/9568170.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值