这题折腾了好久。。。。
$C_{x}表示1到n中phi(i)==x的数量有多少$
$原式=\sum_{i=1}^n\sum_{j=1}^n \phi_{( \phi\ _i,\phi_j)}$
$=\sum_{d=1}^n \sum_{i=1}^{n/d}\sum_{j=1}^{n/d} \phi_{d} C_{id}*C_{jd}[gcd(i,j)==1]$
$=\sum_{d=1}^n \sum_{i=1}^{n/d}\sum_{j=1}^{n/d} \phi_{d} C_{id}*C_{jd}\sum_{d2|i且d2|j}u_{d2}$
这里卡住了。。。
$=\sum_{d=1}^n \sum_{d2=1}^{n/d}\sum_{i=1}^{n/(d*d2)}\sum_{j=1}^{n/(d*d2)} \phi_{d} C_{i*d*d2}*C_{j*d*d2}*u_{d2}$
关于这部分
$G(x) = \sum_{i=1}^{n/x}\sum_{j=1}^{n/x}C_{ix}*C_{jx}$
这部分可以分开求:
$G(x)=(\sum_{i=1}^{n/x}C_{ix})^2$
这时候就很清晰了,$G(x)可以在O(nlog_{2}n)$预处理出来。
所以原式
$\sum_{d=1}^n \phi_{d} \sum_{d2=1}^{n/d}u_{d2}*G(d2*d)$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| ll phi[maxn],mu[maxn],pri[maxn],vis[maxn]; void get_phi() { phi[1]=mu[1]=1; int tot=0; for(int i=2;i<=maxn-5;i++) { if(!vis[i]) pri[++tot]=i,mu[i]=-1,phi[i]=i-1; for(int j=1;j<=tot&&pri[j]*i<=maxn-5;j++) { vis[pri[j]*i]=1; if(i%pri[j]==0) {mu[i*pri[j]]=0;phi[i*pri[j]]=phi[i]*pri[j];break;} else mu[i*pri[j]]=-mu[i],phi[i*pri[j]]=phi[i]*(pri[j]-1); } } } ll c[maxn],g[maxn],f[maxn];
void solve() { int t; sa(t); get_phi(); while(t--) { memset(c,0,sizeof(c)); memset(f,0,sizeof(f)); memset(g,0,sizeof(g)); int n; sa(n); repp(i,1,n){ c[phi[i]]++; } repp(x,1,n) { for(int i=1;i<=n/x;i++) { g[x]+=c[i*x]; } } repp(x,1,n) { g[x]=g[x]*g[x]; } ll ans = 0; repp(d,1,n) { ll tmp = 0; repp(d2,1,n/d) { tmp+=mu[d2]*g[d2*d]; } ans+=phi[d]*tmp; } printf("%lld\n",ans); } }
int main() { solve(); return 0; }
|