题意: 计算gcd(1,n)+gcd(2,n)+...+gcd(n-1, n);
解题思路:
#include<stdio.h>
#include<string.h>
const int MAXN=4000010;
int dp[MAXN];
int sum[MAXN];
long long int we[MAXN];
int main()
{
memset(dp,0,sizeof(dp));
dp[1]=1;
for(int i=2; i<MAXN; i++)
{
if(dp[i])continue;
for(int j=i; j<MAXN; j+=i)
{
if(!dp[j])dp[j]=j;
dp[j]=dp[j]/i*(i-1);
}
}
for(int i=1;i<=MAXN;i++)
{
for(int j=2*i;j<=MAXN;j+=i)
{
sum[j]+=i*dp[j/i];
}
}
we[2]=sum[2];
for(int i=3;i<=MAXN;i++)
{
we[i]+=we[i-1]+sum[i];
}
int N;
while(~scanf("%d",&N)&&N)
{
printf("%lld\n",we[N]);
}
return 0;
}