题目链接:http://lightoj.com/volume_showproblem.php?problem=1375
题意:给出n。求allPairLcm函数的返回值。
思路:
其中,这一步
的原因是,每个小于x的数中与x互质的数字之和等于phi[x]/2*x,因为它们是成对出现的,且每对之和为x,比如x=12,那么与x互质的数字为1,5,7,11,其中1+11=5+7=12。
#include <iostream>
#include <cstdio>
#define i64 unsigned long long
using namespace std;
int C,num=0;
const int MAX=3000005;
i64 f[MAX],s2[MAX];
void init()
{
i64 i,j,p=1;
f[1]=1;
for(i=2;i<MAX;i++) if(!f[i]) for(j=i;j<MAX;j+=i)
{
if(!f[j]) f[j]=j;
f[j]=f[j]/i*(i-1);
}
for(i=2;i<MAX;i++) for(j=i;j<MAX;j+=i) s2[j]+=i*f[i];
for(i=1;i<MAX;i++)
{
if(s2[i]%2==0) f[i]=i*(1+s2[i]/2);
else f[i]=i+i/2*s2[i];
}
for(i=1;i<MAX;i++) s2[i]=s2[i-1]+f[i]-i;
}
int n;
int main()
{
init();
for(scanf("%d",&C);C--;)
{
scanf("%d",&n);
printf("Case %d: %llu\n",++num,s2[n]);
}
return 0;
}