莫比乌斯反演
详细的不赘述了,都在这里
若
f(n)
是积性函数,则如下
F(x)
也是积性函数
容斥原理
来考虑最简单的问题:1~n中的x的倍数 (1≤x≤n) 有多少个?
用下图来表示容斥的情况。每个圆内均有一个数字x,圆表示x的倍数的集合
F(x)
。
若
x∣y
,则
F(y)∈F(x)
定义 f(x) 为1~n中最大约数为x的数集,则 f(x) 就不是完整的圆了,可得
其实 F(x) 很好求。如果反过来要求 f(x) 应该怎么办?
举例:n=30, 求
f(2)
f(2)=F(2)−F(4)−F(6)−F(10)+F(12)−F(14)+F(20)−F(22)−F(26)+F(28)+F(30)
只有在
y|x时,F(y)
才会被考虑。设
F(y)
前的系数为
ay
设p为素数:
当
yx=p
时,
F(y)
只属于
F(x)
,故
ay=−1
;
当
yx=p1p2
时,
F(y)
属于
F(x),F(xp1),F(xp2),又axp1=axp2=−1
,故
ay=1
;
…
当
yx=p1p2...ps
时,改变状态的有
−C1s+C2s−C3s...+(−1)s−1Cs−1s=−1−(−1)s,故ay=(−1)s
;
若
xyi=pv11pv22...pvss且至少有一个v大于1
,则已有标记为
这证明过程和莫比乌斯函数的 证明是一样的,得到的系数即 μ(yx) 。得到
感受一下差别
莫比乌斯 | 容斥 |
---|---|
d是x的约数 | y是x的倍数 |
μ(xd) 自变量是跳跃的 | μ(yx) 自变量是连续的 |
f(d) 为有限项 | f(y) 为无限项(除非规定了一个范围) |
因此要根据不同的已知条件来确定是哪一种。
校赛C题
求区间[a,b]中与n互质的数的个数。
分析:求[1,a]中与n互质的个数。
设F(y)是[1,a]中y的倍数的个数,则F(y)=a/y;设f(x)是[1,a]中与n的最大公约数是x的数的个数。注意,这里和上面容斥原理定义的函数略有不同。
f(x)
的条件=旧有条件&新条件
,造成
F(y)
的条件范围也缩小了。
POJ 3904
给n个数,求其中四个数的gcd是1的情况有多少种。
校赛D题
给n个数,求其中三个数的gcd是m的情况有多少种。
令
f(x)=三个数的gcd是x的情况数
F(x)=三个数的gcd是x的倍数的情况数
n个数中有约数为x的数有y个,则
F(x)=C3y
求
f(m)
超级变变变
gcd
求 ∑a=1N∑b=1Mgcd(a,b)
预备: ∑d∣nϕ(d)=n (证明)
若 d∣gcd(a,b) ,则 ∑d∣gcd(a,b)ϕ(d)=gcd(a,b) ,且 d∣a, d∣b ,
∑a=1N∑b=1Mgcd(a,b)=∑a=1N∑b=1M∑d∣a,d∣bϕ(d)=∑d=1min{N,M}ϕ(d)∑a=1,d∣aN∑b=1,d∣bM1=∑d=1min{N,M}ϕ(d)(∑a=1,d∣aN1)(∑b=1,d∣bM1)=∑d=1min{N,M}ϕ(d)NdMd求 ∑a=1N∑b=1M[gcd(a,b)=1]
预备: ∑d∣nμ(d)=[n=1] (证明)
若 d∣gcd(a,b) ,则 ∑d∣gcd(a,b)μ(d)=[gcd(a,b)=1] ,且 d∣a, d∣b
∑a=1N∑b=1M[gcd(a,b)=1] =∑a=1N∑b=1M∑d∣a,d∣bμ(d)=∑d=1min{N,M}μ(d)∑a=1,d∣aN∑b=1,d∣bM1=∑d=1min{N,M}μ(d)(∑a=1,d∣aN1)(∑b=1,d∣bM1)=∑d=1min{N,M}μ(d)NdMd求 ∑a=1N∑b=1Mgcd(a,b) (另一种证法)
∑a=1N∑b=1Mgcd(a,b) (2式结果) (x=d⋅g) =∑a=1N∑b=1Mg⋅[gcd(a,b)=g]=∑g=1min{N,M}g∑a=1N/g∑b=1M/g[gcd(a,b)=1]=∑g=1min{N,M}g∑d=1min{N/g,M/g}μ(d)N/gdM/gd=∑x=1min{N,M}∑g∣xg⋅μ(xg)NxMx=∑x=1min{N,M}NxMx∑g∣xg⋅μ(xg)
与1的结果对比∑g∣xg⋅μ(xg)=ϕ(x)两者相等。求 ∑a=1N∑b=1Mlcm(a,b)
∑a=1N∑b=1Mlcm(a,b)由2得到x=dg=∑a=1N∑b=1Mabgcd(a,b)=∑g=1min{N,M}1g∑a=1N∑b=1Mab[gcd(a,b)=g]=∑g=1min{N,M}g∑a=1N/g∑b=1M/gab[gcd(a,b)=1]=∑g=1min{N,M}g∑d=1min{N/g,M/g}μ(d)(∑a=1,d∣aN/ga)(∑b=1,d∣bM/gb)=∑g=1min{N,M}g∑d=1min{N/g,M/g}μ(d)(d∑a=1N/g/da)(d∑b=1M/g/db)=∑g=1min{N,M}g∑d=1min{N/g,M/g}μ(d)(d∑a=1N/g/da)(d∑b=1M/g/db)=∑g=1min{N,M}g∑d=1min{N/g,M/g}μ(d)⋅14d2⋅N/gd(N/gd+1)M/gd(M/gd+1)=14∑x=1min{N,M}NxMx(Nx+1)(Mx+1)x∑d∣xd⋅μ(d)
这里 x∑d∣xd⋅μ(d) 可以先预处理出来。
O(2N−−√+2M−−√) 优化
当遇到类似于
∑x=1min{N,M}ϕ(x)NxMx
的通项公式时,一项一项求得速度很慢。观察
Nx和Mx
的变化曲线,可以发现,当x比较大的时候,
Nx和Mx
将保持在一些区间内不变。
如N=100时,x在区间[51,100]内
Nx
保持为1;M=56,x在区间[29,56]内
Mx
保持为1。因此x
在区间[51,56]内
NxMx
保持不变为1。
对于N,x每逢一个约数都使得
Nx
发生改变,故这样的结点大约有
2N−−√
个。
同时,要对欧拉函数求前缀和,使查询更快。
LL gao(int n, int m){
LL re = 0;
if(n > m) swap(n, m);
int last;
for(int i = 1;i <= n;i = last+1){
last = min(n/(n/i), m/(m/i));
re += 1LL*(n/i)*(m/i)*(sum[last]-sum[i-1]);
}
return re;
}
HDU 5528
欧拉函数变换
南大省赛
求
G(N,M)=∑a=1N∑b=1Ma2b2gcd(a,b)
若
d∣gcd(a,b)
,则
∑d∣gcd(a,b)ϕ(d)=gcd(a,b)
,且
d∣a, d∣b
另一种解法:
计蒜客初赛第二场D题
在n*m个格点中选择两个格点作出直线。求所有不重合直线的条数。
同一斜率的直线有如图(n-1-a+m-1-b-1)条,其中 1<a<n,1<b<m,gcd(a,b)=1 ,故所有的直线条数为
用莫比乌斯函数展开慢慢推。
公式打到手抽筋…