Description
F(n)=∑ni=1∑nj=1ϕ(ϕ(i),ϕ(j))
F
(
n
)
=
∑
i
=
1
n
∑
j
=
1
n
ϕ
(
ϕ
(
i
)
,
ϕ
(
j
)
)
其中
ϕ
ϕ
表示欧拉函数。欧拉函数
ϕ(n)
ϕ
(
n
)
是不超过n的数中与n互质的数的数目。
ϕ(ϕi,ϕj)
ϕ
(
ϕ
i
,
ϕ
j
)
表示i,j欧拉函数值的最大公约数的欧拉函数值.
给出n,求F(n)的值。
Input
一行,包含正整数T,表示数据组数。T<=5
接下来T行每行一个正整数n。n<=2*10^6
Output
共T行,每行包含一个答案。
Input示例
1
1
Output示例
1
Solution
莫比乌斯反演。。。蒟蒻不会写系列
依题意,有
Ans=∑ni=1∑nj=1ϕ(ϕi),ϕ(j))
A
n
s
=
∑
i
=
1
n
∑
j
=
1
n
ϕ
(
ϕ
i
)
,
ϕ
(
j
)
)
枚举其gcd,
Ans=∑nd=1ϕ(d)∗∑ni=1∑nj=1[gcd(ϕ(i),ϕ(j)=d]
A
n
s
=
∑
d
=
1
n
ϕ
(
d
)
∗
∑
i
=
1
n
∑
j
=
1
n
[
g
c
d
(
ϕ
(
i
)
,
ϕ
(
j
)
=
d
]
设
g(d)=∑ni=1∑nj=1[d|gcd(ϕ(i),ϕ(j))]
g
(
d
)
=
∑
i
=
1
n
∑
j
=
1
n
[
d
|
g
c
d
(
ϕ
(
i
)
,
ϕ
(
j
)
)
]
f(d)=∑ni=1∑nj=1[gcd(ϕ(i),ϕ(j))=d]
f
(
d
)
=
∑
i
=
1
n
∑
j
=
1
n
[
g
c
d
(
ϕ
(
i
)
,
ϕ
(
j
)
)
=
d
]
则有
g(d)=∑d|kf(k)
g
(
d
)
=
∑
d
|
k
f
(
k
)
f(n)=∑n|dμ(dn)∗g(d)
f
(
n
)
=
∑
n
|
d
μ
(
d
n
)
∗
g
(
d
)
Ans=∑nd=1ϕ(d)∗f(d)
A
n
s
=
∑
d
=
1
n
ϕ
(
d
)
∗
f
(
d
)
f(d)可以在O(nln(n))的时间内求出
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define N 2000020
#define M 2000000
#define LL long long
LL t[N],prime[N],phi[N],mu[N];
LL f[N],g[N];
int ti,n;
void pre()
{
phi[1]=mu[1]=1;
memset(t,0,sizeof(t));
memset(prime,0,sizeof(prime));
for (int i=2;i<=M;i++)
{
if (t[i]==0)
{
prime[++prime[0]]=i;
mu[i]=-1; phi[i]=i-1;
}
for (int j=1;j<=prime[0];j++)
{
int k=i*prime[j];
if (k>M) break;
t[k]=1;
if (i%prime[j]==0)
{
mu[k]=0;
phi[k]=phi[i]*prime[j];
break;
}
mu[k]=-mu[i];
phi[k]=phi[i]*phi[prime[j]];
}
}
}
LL solve(int n)
{
memset(t,0,sizeof(t));
memset(g,0,sizeof(g));
memset(f,0,sizeof(f));
for (int i=1;i<=n;i++)
t[phi[i]]++;
for (int d=1;d<=n;d++)
for (int i=1;i<=n/d;i++)
g[d]+=t[i*d];
for (int i=1;i<=n;i++)
g[i]=g[i]*g[i];
for (int d=1;d<=n;d++)
for (int i=1;i<=n/d;i++)
f[d]+=mu[i]*g[i*d];
//for (int i=1;i<=n;i++)
// printf("%d %d %d %d %d\n",i,phi[i],mu[i],g[i],f[i]);
LL ans=0;
for (int i=1;i<=n;i++)
ans+=phi[i]*f[i];
return ans;
}
int main()
{
pre();
scanf("%d",&ti);
for (int ii=1;ii<=ti;ii++)
{
scanf("%d",&n);
printf("%lld\n",solve(n));
}
return 0;
}