51nod 1594

这题折腾了好久。。。。

51nod 1594

$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;
}