题目描述
BB
其实是一道sb题
1013+10组数据足以把
杜教筛/min25/洲阁筛/反演+筛μ/分块+筛质数
给送上天了
所以正解肯定是T√n的做法
性质
欧拉函数有一个著名的性质:
n
=
∑
d
∣
n
φ
(
d
)
n=\sum_{d|n}{\varphi(d)}
n=∑d∣nφ(d)
证明:
设
F
(
n
)
=
∑
d
∣
n
φ
(
d
)
F(n)=\sum_{d|n}{\varphi(d)}
F(n)=∑d∣nφ(d),则
F
(
n
)
∗
F
(
m
)
=
∑
i
∣
n
φ
(
i
)
∗
∑
j
∣
m
φ
(
j
)
F(n)*F(m)=\sum_{i|n}{\varphi(i)}*\sum_{j|m}{\varphi(j)}
F(n)∗F(m)=∑i∣nφ(i)∗∑j∣mφ(j)(nm互质)
=
∑
i
∣
n
∑
j
∣
m
φ
(
i
∗
j
)
=\sum_{i|n}{\sum_{j|m}{\varphi(i*j)}}
=∑i∣n∑j∣mφ(i∗j)
=
F
(
n
∗
m
)
=F(n*m)
=F(n∗m)
所以证得F(n)是积性函数
求
F
(
p
k
)
F(p^k)
F(pk)(p为质数)
F
(
p
k
)
=
∑
i
=
0
k
φ
(
p
i
)
F(p^k)=\sum_{i=0}^{k}{\varphi(p^i)}
F(pk)=∑i=0kφ(pi)
=
(
∑
i
=
1
k
p
i
∗
(
1
−
1
p
)
)
+
1
=(\sum_{i=1}^{k}{p^i*(1-\frac{1}{p})})+1
=(∑i=1kpi∗(1−p1))+1
=
(
∑
i
=
1
k
p
i
−
1
∗
(
p
−
1
)
)
+
1
=(\sum_{i=1}^{k}{p^{i-1}*(p-1)})+1
=(∑i=1kpi−1∗(p−1))+1
=
(
∑
i
=
1
k
p
i
−
p
i
−
1
)
+
1
=(\sum_{i=1}^{k}{p^i-p^{i-1}})+1
=(∑i=1kpi−pi−1)+1
=
p
k
−
p
0
+
1
=p^k-p^0+1
=pk−p0+1
=
p
k
=p^k
=pk
由于F(n)是积性函数,且F(pk)=pk,所以可以推得F(n)=n(对于任意n)
所以
F
(
n
)
=
∑
d
∣
n
φ
(
d
)
F(n)=\sum_{d|n}{\varphi(d)}
F(n)=∑d∣nφ(d)
n
=
∑
d
∣
n
φ
(
d
)
n=\sum_{d|n}{\varphi(d)}
n=∑d∣nφ(d)
参考:https://blog.youkuaiyun.com/liuzibujian/article/details/81086324
题解
题目的
f
(
n
)
=
∏
a
i
⌊
p
i
2
⌋
f(n)=\prod{{a_i}^{\left \lfloor \frac{p_i}{2} \right \rfloor}}
f(n)=∏ai⌊2pi⌋
可以发现,每个质因子的质数除了2
那么
f
(
n
)
=
∑
d
∣
f
(
n
)
φ
(
d
)
f(n)=\sum_{d|f(n)}{\varphi(d)}
f(n)=∑d∣f(n)φ(d)
本质上,枚举d其实是枚举n中指数为1的倍数的约数
由于先前除了2,考虑把d和f(n)的指数都乘以2,这样得到的实际上是一样的
所以
f
(
n
)
=
∑
d
2
∣
n
φ
(
d
)
f(n)=\sum_{d^2|n}{\varphi(d)}
f(n)=∑d2∣nφ(d)
a
n
s
=
∑
i
=
1
n
f
(
i
)
=
∑
i
=
1
n
∑
d
2
∣
i
φ
(
d
)
ans=\sum_{i=1}^{n}{f(i)}=\sum_{i=1}^{n}{\sum_{d^2|i}{\varphi(d)}}
ans=∑i=1nf(i)=∑i=1n∑d2∣iφ(d)
=
∑
d
=
1
⌊
n
⌋
∑
d
2
∣
i
  
a
n
d
  
i
⩽
n
φ
(
d
)
=\sum_{d=1}^{\left \lfloor \sqrt{n} \right \rfloor}{\sum_{d^2|i \; and \; i\leqslant n}{\varphi(d)}}
=∑d=1⌊n⌋∑d2∣iandi⩽nφ(d)
=
∑
d
=
1
⌊
n
⌋
φ
(
d
)
∗
⌊
n
d
2
⌋
=\sum_{d=1}^{\left \lfloor \sqrt{n} \right \rfloor}{\varphi(d)*\left \lfloor \frac{n}{d^2} \right \rfloor}
=∑d=1⌊n⌋φ(d)∗⌊d2n⌋
没了
code
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define Len 3162277
using namespace std;
bool f[Len+1];
int p[Len+1];
int phi[Len+1];
int T,N,i,j,k,l,len;
long long n,ans;
void init()
{
int i,j;
memset(f,0,sizeof(f));
len=0;
phi[1]=1;
fo(i,2,Len)
{
if (!f[i])
{
p[++len]=i;
phi[i]=i-1;
}
fo(j,1,len)
if ((long long)i*p[j]<=Len)
{
f[i*p[j]]=1;
phi[i*p[j]]=phi[i]*p[j];
if (!(i%p[j]))
break;
phi[i*p[j]]=phi[i*p[j]]/p[j]*(p[j]-1);
}
else
break;
}
}
int main()
{
// freopen("e.in","r",stdin);
init();
scanf("%d",&T);
for (;T;--T)
{
scanf("%lld",&n);
N=floor(sqrt(n));
ans=0;
fo(i,1,N)
ans+=phi[i]*(n/i/i);
printf("%lld\n",ans);
}
}