[欧拉函数] Bzoj P2226 LCMSum
Description
Given n, calculate the sum LCM(1,n) + LCM(2,n) + .. + LCM(n,n), where LCM(i,n) denotes the Least Common Multiple of the integers i and n.
题解
代码
1 #include <cstdio> 2 #include <iostream> 3 #define N 1000010 4 #define ll long long 5 using namespace std; 6 ll T,bz[N],phi[N],q[N],ans[N]; 7 int main() 8 { 9 scanf("%lld",&T),phi[1]=1; 10 for (ll i=2;i<=N;i++) 11 { 12 if (!bz[i]) q[++q[0]]=i,phi[i]=i-1; 13 for (ll j=1;j<=q[0]&&i*q[j]<=N;j++) 14 if (i*q[j]<N) 15 { 16 bz[i*q[j]]=1; 17 if (i%q[j]==0) { phi[i*q[j]]=phi[i]*q[j]; break; } 18 phi[i*q[j]]=phi[i]*(q[j]-1); 19 } 20 } 21 for (int i=1;i<=N;i++) for (int j=1;i*j<=N;j++) ans[i*j]+=j*phi[j]/2; 22 for (ll i=1;i<=N;i++) ans[i]=i*ans[i]+i; 23 for (ll i=1,x;i<=T;i++) scanf("%lld",&x),printf("%lld\n",ans[x]); 24 }