[AHOI2005] COMMON 约数研究
解析:
很明显暴力算各个F[i]会超时,因为枚举因数是O(sqrt(n))级别的,总复杂度就成了O(nsqrt(n)),对于n<=1000000太大了。
所以采取算“各个约数的贡献”的方法,当我们计算F[K],可以把k,k2,k3……全加上一个它的因子,因为最后是算总和,连加都不用:最终的贡献就是n/k
代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define rep(i,x,y) for (int i=x;i<=y;i++)
#define read(x) scanf("%d",&x)
using namespace std;
const int maxn=1000000+10;
int n,ans;
int main()
{
read(n);
ans=0;
rep(i,1,n) ans+=(n/i);
printf("%d\n",ans);
return 0;
}
这里体现了一种重要思想:把n看成整体,用各个数的贡献代替单独计算

浙公网安备 33010602011771号