[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看成整体,用各个数的贡献代替单独计算

posted @ 2016-02-11 10:00  Krew  阅读(124)  评论(0)    收藏  举报