记录一下推导这题的时候发现的一个东西。
按照我一开始的推法,推出来是这个东西:
∑
i
=
1
n
μ
2
(
i
)
⌊
n
i
⌋
2
\begin{aligned} \sum_{i=1}^n\mu^2(i)\left\lfloor\sqrt{\frac{n}{i}}\right\rfloor^2 \end{aligned}
i=1∑nμ2(i)⌊in⌋2
其中
⌊
n
i
⌋
2
\left\lfloor\sqrt{\dfrac{n}{i}}\right\rfloor^2
⌊in⌋2 就是在
[
1
,
n
i
]
\left[1,\dfrac{n}{i}\right]
[1,in] 中最大的完全平方数。
这个可以 min25 筛
μ
2
\mu^2
μ2 配上整除分块做,但不能过
n
≤
1
0
14
n\leq 10^{14}
n≤1014,结果一直推不下去。然后换了种推法,得到:
2
(
∑
i
=
1
n
φ
(
i
)
⌊
n
i
2
⌋
)
−
n
2\left(\sum_{i=1}^{\sqrt n}\varphi(i)\lfloor\frac{n}{i^2}\rfloor\right)-n
2⎝⎛i=1∑nφ(i)⌊i2n⌋⎠⎞−n
这样就有
O
(
n
)
O(\sqrt n)
O(n) 的做法了。
一个疑惑的点是:为什么上下不能互推?
因为我太菜了。 其实是可以的,首先第一个问题是这个
⌊
n
i
⌋
2
\left\lfloor\sqrt{\dfrac{n}{i}}\right\rfloor^2
⌊in⌋2 看起来很烦。
tjy 一个非常神奇的方法,我们化简为繁:
n
2
=
∑
a
=
1
n
(
2
a
−
1
)
n^2=\sum_{a=1}^n(2a-1)
n2=∑a=1n(2a−1),于是:
∑
i
=
1
n
μ
2
(
i
)
⌊
n
i
⌋
2
=
∑
i
=
1
n
μ
2
(
i
)
∑
a
2
i
≤
n
(
2
a
−
1
)
=
∑
a
=
1
n
(
2
a
−
1
)
∑
a
2
i
≤
n
μ
2
(
i
)
\begin{aligned} &\sum_{i=1}^n\mu^2(i)\left\lfloor\sqrt{\frac{n}{i}}\right\rfloor^2\\ =&\sum_{i=1}^n\mu^2(i)\sum_{a^2i\leq n}(2a-1)\\ =&\sum_{a=1}^{\sqrt n}(2a-1)\sum_{a^2i\leq n}\mu^2(i) \end{aligned}
==i=1∑nμ2(i)⌊in⌋2i=1∑nμ2(i)a2i≤n∑(2a−1)a=1∑n(2a−1)a2i≤n∑μ2(i)
有一个把
μ
2
(
n
)
\mu^2(n)
μ2(n) 转化为
μ
(
n
)
\mu(n)
μ(n) 的式子:
μ
2
(
n
)
=
∑
d
2
∣
n
μ
(
d
)
\mu^2(n)=\sum_{d^2|n}\mu(d)
μ2(n)=d2∣n∑μ(d)
可以这么理解,我们考虑
μ
2
(
n
)
\mu^2(n)
μ2(n) 和
μ
(
n
)
\mu(n)
μ(n) 在某个质数
p
p
p 的幂处的取值:
μ
2
(
n
)
:
{
1
,
1
,
0
,
⋯
}
\mu^2(n):\{1,1,0,\cdots\}
μ2(n):{1,1,0,⋯},
μ
(
n
)
:
{
1
,
−
1
,
0
,
⋯
,
}
\mu(n):\{1,-1,0,\cdots,\}
μ(n):{1,−1,0,⋯,},容易发现
μ
2
(
n
)
\mu^2(n)
μ2(n) 在
p
k
p^k
pk 处的取值可以等于
μ
(
n
)
\mu(n)
μ(n) 在
p
0
,
⋯
,
p
⌊
k
2
⌋
p^0,\cdots,p^{\lfloor\frac{k}{2}\rfloor}
p0,⋯,p⌊2k⌋ 处取值的和。
用贝尔级数来看, μ p 2 ( x ) = 1 + x = 1 − x 2 1 − x = μ p ( x 2 ) ∗ 1 p \mu^2_p(x)=1+x=\frac{1-x^2}{1-x}=\mu_p(x^2)*1_p μp2(x)=1+x=1−x1−x2=μp(x2)∗1p。
(这条式子还可以使得 μ 2 ( n ) \mu^2(n) μ2(n) 的前缀和在 O ( n ) O(\sqrt n) O(n) 的时间内求出)
然后带进去就可以互推了:
∑
a
=
1
n
(
2
a
−
1
)
∑
i
=
1
⌊
n
a
2
⌋
μ
2
(
i
)
=
∑
a
=
1
n
(
2
a
−
1
)
∑
i
=
1
⌊
n
a
2
⌋
∑
d
2
∣
i
μ
(
d
)
=
∑
d
=
1
n
μ
(
d
)
∑
a
=
1
n
(
2
a
−
1
)
⌊
n
a
2
d
2
⌋
=
∑
T
=
1
n
⌊
n
T
2
⌋
∑
d
∣
T
μ
(
d
)
(
2
T
d
−
1
)
=
∑
T
=
1
n
⌊
n
T
2
⌋
(
2
⋅
φ
(
T
)
−
[
T
=
1
]
)
=
2
(
∑
T
=
1
n
⌊
n
T
2
⌋
φ
(
T
)
)
−
n
\begin{aligned} &\sum_{a=1}^{\sqrt n}(2a-1)\sum_{i=1}^{\lfloor\frac{n}{a^2}\rfloor}\mu^2(i)\\ =&\sum_{a=1}^{\sqrt n}(2a-1)\sum_{i=1}^{\lfloor\frac{n}{a^2}\rfloor}\sum_{d^2|i}\mu(d)\\ =&\sum_{d=1}^{\sqrt n}\mu(d)\sum_{a=1}^{\sqrt n}(2a-1)\lfloor\frac{n}{a^2d^2}\rfloor\\ =&\sum_{T=1}^{\sqrt n}\lfloor\frac{n}{T^2}\rfloor\sum_{d|T}\mu(d)(\frac{2T}{d}-1)\\ =&\sum_{T=1}^{\sqrt n}\lfloor\frac{n}{T^2}\rfloor(2\cdot \varphi (T)-[T=1])\\ =&2\left(\sum_{T=1}^{\sqrt n}\lfloor\frac{n}{T^2}\rfloor\varphi(T)\right)-n \end{aligned}
=====a=1∑n(2a−1)i=1∑⌊a2n⌋μ2(i)a=1∑n(2a−1)i=1∑⌊a2n⌋d2∣i∑μ(d)d=1∑nμ(d)a=1∑n(2a−1)⌊a2d2n⌋T=1∑n⌊T2n⌋d∣T∑μ(d)(d2T−1)T=1∑n⌊T2n⌋(2⋅φ(T)−[T=1])2⎝⎛T=1∑n⌊T2n⌋φ(T)⎠⎞−n
总的来说,感觉转化过程中比较神奇的两步:(虽然感觉有点巧)
- n 2 n^2 n2 的转化。
- μ 2 ( n ) \mu^2(n) μ2(n) 的转化。
代码如下:
#include<bits/stdc++.h>
#define N 10000010
#define ll long long
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^'0');
ch=getchar();
}
return x*f;
}
ll n;
int sn;
int cnt,prime[N],phi[N];
bool notprime[N];
void init()
{
phi[1]=1;
for(int i=2;i<=sn;i++)
{
if(!notprime[i]) prime[++cnt]=i,phi[i]=i-1;
for(int j=1,v;j<=cnt&&(v=i*prime[j])<=sn;j++)
{
notprime[v]=1;
if(!(i%prime[j]))
{
phi[v]=phi[i]*prime[j];
break;
}
phi[v]=phi[i]*phi[prime[j]];
}
}
}
int main()
{
cin>>n;
sn=sqrt(n);
init();
ll ans=0;
for(int i=1;i<=sn;i++)
ans+=1ll*phi[i]*(n/(1ll*i*i));
printf("%lld\n",ans*2ll-n);
return 0;
}