1968: [Ahoi2005]COMMON 约数研究
Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 2170 Solved: 1655
[ Submit][ Status][ Discuss]
Description
Input
只有一行一个整数 N(0 < N < 1000000)。
Output
只有一行输出,为整数M,即f(1)到f(N)的累加和。
Sample Input
3
Sample Output
5
HINT
Source
题解:线性筛求约束个数
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#define N 1000003
#define LL long long
using namespace std;
int prime[N],pd[N],t[N],d[N],n;
void init()
{
d[1]=1;
for (int i=2;i<=n;i++) {
if (!pd[i]) {
prime[++prime[0]]=i;
d[i]=2; t[i]=1;
}
for (int j=1;j<=prime[0];j++) {
if (prime[j]*i>n) break;
pd[prime[j]*i]=1;
if (i%prime[j]==0) {
t[i*prime[j]]=t[i]+1;
d[i*prime[j]]=d[i]/(t[i]+1)*(t[i*prime[j]]+1);
break;
}
else {
t[i*prime[j]]=1;
d[i*prime[j]]=d[i]*2;
}
}
}
}
int main()
{
scanf("%d",&n);
LL ans=0; init();
for (int i=1;i<=n;i++) ans+=(LL)d[i];
printf("%I64d\n",ans);
}