题意:
给一个n,累加1到n每个数的约数个数,输出结果
n最大为10的10次方
样例:
n=3;
对于1,约数有1,约数个数1
对于2,约数有1,2,约数个数2
对于3,约数有1,3,约数个数2
结果为5;
题解:
首先,对于1到n每个数计算它们对答案的贡献,比如2是多少数的约数?5是多少数的约数。
所以我们可以看出结果是
∑
i
=
1
n
⌊
n
i
⌋
\sum_{i=1}^n\lfloor\frac{n}{i} \rfloor
i=1∑n⌊in⌋
这里我们直接用分块加速,控制时间。
所谓分块,就是把那些函值相等的函数进行区间分块,想杜教筛,Min_25也是用的这样的方法进行加速
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
int n;
ll ans=0;
scanf("%d",&n);
for(int l=1,r;l<=n;l=r+1){
r=n/(n/l);
ans+=(r-l+1)*(n/l);
}
cout<<ans<<endl;
return 0;
}