題意
輸入正整數n,求 即求所有滿足 的數對 所對應的 之和。分析
設 則答案爲 。
用 表示滿足 的正整數 的個數,則
若依次計算 ,速度較慢,但可以逆向思維,對每個 枚舉它的倍數 (並更新 的值),時間複雜度與素數篩法一樣。代碼
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=4e6+2;
ll s[maxn],f[maxn];
int n;
int p[maxn+10]={0};
void init()
{
int i,j;
for(i=1; i<=maxn; i++) p[i]=i;
for(i=2; i<=maxn; i+=2) p[i]/=2;
for(i=3; i<=maxn; i+=2)
if(p[i]==i){
for(j=i; j<=maxn; j+=i)
p[j]=p[j]/i*(i-1);
}
}
int main()
{
init();
memset(f,0,sizeof(f));
for(int i=1;i<=maxn;++i)
for(int n=i+i;n<=maxn;n+=i)
f[n]+=i*p[n/i];
s[2]=f[2];
for(int i=3;i<=maxn;++i)
s[i]=s[i-1]+f[i];
while(scanf("%d",&n),n)
printf("%lld\n",s[n]);
return 0;
}