[AHOI2005]约数研究
首先,我们可以分别统计每一个数作为约数所做的贡献,加起来即可。
也即:
[displaystylesum_{i=1}^n{ndiv i}
]
这样就是(O(n))的了,据说还可以用什么“数论分块”,也不知道怎么用。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int n;
int main()
{
scanf("%d", &n);
int ans;
for(int i = 1; i <= n; ++ i) ans += n / i;
printf("%d
", ans);
return 0;
}
当然,还有其他想法。比如:
对于一个数(k),将它拆分成(p*q),其中(p)为最小质因子,那么有:
[f[i*prime[j]]=f[i] * 2 (prime[j]>vis[i])
]
[f[i*prime[j]]=f[i]*(cnt[i]+2)/(cnt[i]+1)
]
于是TLE。
不过有一个神仙做法:https://www.cnblogs.com/xzz_233/p/8365414.html
不知道为什么。