推式子。
莫比乌斯函数
μ 为莫比乌斯函数,定义为
μ(n)=⎩⎨⎧10(−1)kn=1n 含有平方因子k 为 n 的本质不同质因子个数
预处理可以用线性筛。
代码
C++
void init(){
mu[1]=1;
for(int i=2;i<=50000;i++){
if(!hs[i]){
pri[++cnt]=i;
mu[i]=-1;
}
for(int j=1;j<=cnt&&pri[j]*i<=50000;j++){
hs[pri[j]*i]=1;
if(i%pri[j]==0){
mu[i*pri[j]]=0;
break;
}
mu[i*pri[j]]=-mu[i];
}
}
}
这个函数还有一个很神奇的用法,就是 μ(x)2 可以表示这个数是否含有平方因子。
k=1∑xμ2(x)=k=1∑μ(k)⌊k2x⌋
性质
sn=[n=1]=d∣n∑μ(d)
s(n)={10n=1n>1
证明
S 是质因数下标集合。
d∣n∑μ(d)=S⊆{1,…,k}∑μ(i∈S∏pi)=S⊆{1,…,k}∑(−1)∣S∣=j=0∑k(jk)(−1)j=(1−1)k=0.需要用到二项式定理:
(a+b)n=i=0∑n(in)an−ibi
[i⊥j]=[gcd(i,j)=1]=d∣gcd(i,j)∑μ(d)=d∑[d∣i][d∣j]μ(d)
常见技巧
i=1∑nj=1∑m[gcd(i,j)=k]=i=1∑⌊kn⌋j=1∑⌊km⌋[gcd(i,j)=1]
[gcd(i,j)=1]=d∣gcd(i,j)∑μ(d)=d∑[d∣i][d∣j]μ(d)
d=1∑ndkx=1∑⌊dn⌋μ(x)⌊dxn⌋⌊dxn⌋
然后我们令 T=dx:
T=1∑n⌊Tn⌋⌊Tm⌋d∣T∑dkμ(dT)
莫比乌斯反演
如果:f(n)=∑d∣ng(d)。
那么:g(n)=∑d∣nμ(d)f(dn)。
证明
d∣n∑μ(d)f(dn)=d∣n∑μ(d)i∣dn∑g(i)=i∣n∑g(i)d∣in∑μ(d)=i∣n∑g(i)[in=1]=g(n)
还有另一种更常用形式,枚举倍数:
若果:f(n)=∑n∣dg(d)
那么:g(n)=∑n∣dμ(nd)f(d)
证明
n∣d∑μ(nd)f(d)=n∣d∑μ(nd)d∣k∑g(k)=n∣k∑g(k)n∣d∑[nd∣nk]μ(nd)=n∣k∑g(k)nd∣nk∑μ(nd)=n∣k∑g(k)[nk=1]=g(n)
很多时候,我们发现题目中一个函数好求,一个不好求,那么我们可以考虑用好求的那个表示出那个不好求的。
推论
d(ij)=x∣i∑y∣j∑[gcd(x,y)=1]
来自 P3327 [SDOI2015] 约数个数和。
我们考虑证明,我们发现最困难的是很难保证不计算重复。
我们用一个比较人类智慧的想法:对于每一个 pk,令 i 中有 pa:
- 如果 k≤a,那么 i 中有 pk 则表示这个因数有 pk。
- 如果 k>a,j 中有 pk−a 则表示这个因数有 pk。
P2522 [HAOI2011] Problem b
P2522 [HAOI2011] Problem b。
f(n)=i=1∑nj=1∑m[gcd(i,j)=n]
F(n)=∑n∣df(d)=⌊na⌋⌊nb⌋
用莫比乌斯反演再推回 f。
再加上整除分块就行了。
核心代码
C++
int calc(int n,int m,int k){
int res=0;
for(int l=1,r;l<=min(n/k,m/k);l=r+1){
r=min((n/k)/(int)(n/l/k),(m/k)/(int)(m/l/k));
res+=(sum[r]-sum[l-1])*(n/l/k)*(m/l/k);
}
return res;
}
P3327 [SDOI2015] 约数个数和
P3327 [SDOI2015] 约数个数和。
i=1∑nj=1∑mx∣i∑y∣j∑[gcd(x,y)=1]
推导
x=1∑ny=1∑m⌊xn⌋⌊ym⌋[gcd(x,y)=1]
i=1∑nj=1∑m⌊in⌋⌊jm⌋[gcd(i,j)=1]
f(x)=i=1∑nj=1∑m⌊in⌋⌊jm⌋[gcd(i,j)=x]
g(x)=∑x∣df(d)
g(x)=i=1∑nj=1∑m⌊in⌋⌊jm⌋[x∣gcd(i,j)]
g(x)=i=1∑xnj=1∑xm⌊ixn⌋⌊jxm⌋
f(n)=n∣d∑μ(nd)g(d)
f(1)=1∣d∑μ(1d)g(d)=∑i=1nμ(i)g(i)
预处理 S(t)=∑i=1t⌊it⌋,然后整除分块。
另一种形式
我们直接利用下面的式子带进去做:
[gcd(i,j)=1]=d∣gcd(i,j)∑μ(d)=d∑[d∣i][d∣j]μ(d)
常见技巧:
i=1∑nj=1∑m[gcd(i,j)=k]=i=1∑⌊kn⌋j=1∑⌊km⌋[gcd(i,j)=1]
d=1∑ndkx=1∑⌊dn⌋μ(x)⌊dxn⌋⌊dxn⌋
然后我们令 T=dx:
T=1∑n⌊Tn⌋⌊Tm⌋d∣T∑dkμ(dT)
P3704 [SDOI2017] 数字表格
P3704 [SDOI2017] 数字表格。
实在不想打 Latex 了,那就 ctj 吧。
=i=1∏Nj=1∏MFgcd(i,j)=k=1∏NFk(∑i=1N∑j=1M[gcd(i,j)=k])
=i=1∑Nj=1∑M[gcd(i,j)=k]=i=1∑⌊kN⌋j=1∑⌊kM⌋[gcd(i,j)=1]=d=1∑⌊kN⌋μ(d)⌊kdN⌋⌊kdM⌋
=k=1∏NFk(∑d=1⌊kN⌋μ(d)⌊kdN⌋⌊kdM⌋)=T=1∏Nk∣T∏Fkμ(kT)⌊TN⌋⌊TM⌋
令 f(n)=∏d∣nFdμ(dn),可以预处理。
=∏T=1Nf(T)⌊TN⌋⌊TM⌋
分块。
注意:指数不要取模!
P3911 最小公倍数之和
P3911 最小公倍数之和。
令 ci 表示 i 出现的次数。
∑i=1n∑j=1nci×cj×lcm(i,j)
∑i=1n∑j=1nci×cj×gcd(i,j)i×j
∑k=1n∑i=1n∑j=1n[gcd(i,j)=k]ci×cj×ki×j
∑k=1n∑i=1⌊kn⌋∑j=1⌊kn⌋[gcd(i,j)=1]cik×cjk×i×j×k
∑k=1n∑i=1⌊kn⌋∑j=1⌊kn⌋∑d∣gcd(i,j)μ(d)×cik×cjk×i×j×k
∑k=1n∑d=1⌊kn⌋μ(d)×d2∑i=1⌊kdn⌋∑j=1⌊kdn⌋cikd×cjkd×i×j×k
∑k=1n∑kd=1nμ(d)×d2∑i=1⌊kdn⌋∑j=1⌊kdn⌋cikd×cjkd×i×j×k
∑T=1nT(∑d∣Tμ(d)×d)∑i=1⌊Tn⌋∑j=1⌊Tn⌋ciT×cjT×i×j
∑T=1nT(∑d∣Tμ(d)×d)(∑i=1⌊Tn⌋ciT×i)2
左边的括号预处理,右边的暴力。
P5221 Product
P5221 Product。
∏i=1n∏j=1ngcd(i,j)lcm(i,j)
=∏i=1n∏j=1ngcd(i,j)2i∗j
=(∏i=1n∏j=1ni∗j)∗(∏i=1n∏j=1ngcd(i,j))−2
左边的直接计算,右边的:
=\prod_{d=1}^{n}\prod_{i=1}^{n}\prod_{j=1}^{n}[gcd(i,j)==d]\\
=\prod_{d=1}^{n}d^{\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}[gcd(i,j)==1]}$$
也就是对于每一个 $d$ 看有多少个。
然后可以直接莫反(反正 DS 代码过了),但是欧拉函数更方便:
(n!)^{2n}(\Pi_{d=1}^{n}d^{(2\sum_{i=1}^{\frac{n}{d}}\phi(i))-1})^{-2}
注意需要减去 $(1,1)$ 的重复。然后根据欧拉定理对指数取模 $mod-1$ 优化。
### P4240 毒瘤之神的考验
[P4240 毒瘤之神的考验](https://www.luogu.com.cn/problem/P4240)。
\begin{aligned}
\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m} \varphi(ij)
&= \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m} \frac{\varphi(i)\varphi(j)\gcd(i,j)}{\varphi(\gcd(i,j))}
\&= \sum\limits_{d=1}^{n}\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m} \frac{\varphi(i)\varphi(j)d[\gcd(i,j)=d]}{\varphi(d)}
\&= \sum\limits_{d=1}^{n}\frac{d}{\varphi(d)}\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m }\varphi(i)\varphi(j)[\gcd(i,j)=d]
\&= \sum\limits_{d=1}^{n}\frac{d}{\varphi(d)}\sum_{t=1}^{\lfloor\frac{n}{d}\rfloor}\mu(t)\cdot \sum\limits_{i=1}^{\lfloor\frac{n}{dt}\rfloor }\sum\limits_{j=1}^{\lfloor\frac{m}{dt}\rfloor }\varphi(idt)\varphi(jdt)
\&= \sum\limits_{d=1}^{n}\frac{d}{\varphi(d)}\sum_{t=1}^{\lfloor\frac{n}{d}\rfloor}\mu(t)\cdot \sum\limits_{i=1}^{\lfloor\frac{n}{dt}\rfloor }\sum\limits_{j=1}^{\lfloor\frac{m}{dt}\rfloor }\varphi(idt)\varphi(jdt)
\&= \sum\limits_{T=1}^{n}\sum\limits_{d|T} \frac{d\cdot\mu(\frac{T}{d})}{\varphi(d)} \sum\limits_{i=1}^{\lfloor\frac{n}{T}\rfloor }\varphi(ik)\sum\limits_{j=1}^{\lfloor\frac{m}{T}\rfloor }\varphi(jk)
\end{aligned}
\begin{aligned}
f(T) = \sum\limits_{d|T} \frac{d\cdot\mu(\frac{T}{d})}{\varphi(d)}\
g(T, n) = \sum\limits_{i=1}^{n}\varphi(iT)
\end{aligned}
$f$ 可以套路化倍数 $O(n\ln n)$ 预处理,$g$ 递推总状态数 $O(n\ln n)$ 级别。
带回原式:
\sum\limits_{T=1}^{n}f(T)\cdot g(T, \lfloor\frac{n}{T}\rfloor )\cdot g(T,\lfloor\frac{m}{T}\rfloor)
令:
\begin{aligned}
t(a,b,n) = \sum\limits_{T=1}^{n}f(T)\cdot g(T,a)\cdot g(T,b)
\end{aligned}
复杂度还是不对,所以我们尝试优化。我们发现这个东西带有 $\frac{m}{i}$ 这种东西,所以可以尝试根号分治。
- $T$ 很小的时候我们可以暴力枚举 $T$ 计算。
- $T$ 很大的时候我们使用预处理的东西计算。