今天凌晨学习了莫比乌斯反演,来总结下具体思路。
主(所)要(有)的内容都来自于
http://97littleleaf11.xyz/oi/dirichlet_convolution/#i-7
1.狄利克雷卷积
定义两个函数
f
和
显然狄利克雷卷积满足交换律,结合律和加法的分配律
2.单位元
狄利克雷卷积的单位元,即满足以下条件的函数:
那么,则知道:
3.反演
设:
则有:
这个根据单位元和等式的性质可以得出。
那么:
4.莫比乌斯函数
莫比乌斯函数是这样的函数:
if(n==1)μ(n)=1
if(n==p1p2p3...pk)μ(n)=(−1)k
if(n中存在>=2的质数次幂)μ(n)=0
<这是一个不会用Latex的智障写的>
5.莫比乌斯函数性质
证明:
在n = 1时显然成立。
假设n的素数分解形式: n=Πki=0peii
考虑到如果 d 的分解形式如果是含有平方因子的,那么就是0了,即所有有效的
二项式定理逆用:
6.莫比乌斯反演
终于进入正题了么……
考虑莫比乌斯函数的逆函数 e
即:
我们可以知道 e(n)=1 .
即对于任意的n, e(n)=1
我们现在要证明的是:
由普通的反演,我们知道了这个:
我们可以把 f 写成卷积的形式:
我们知道 e⊙μ=I
那么把普遍的反演的 b(d) 就可以换成 μ(d) 了。
这样就证明完毕了。
我们知道莫比乌斯反演的第一种形式是:
莫比乌斯反演还有另外一种形式:
证明:
PoPoQQQ:证明同理。
证明:
令
k=dn
我们注意到,对于 t=pn , μ(k)g(t) 会被结算 k|p 次.
所以我们改写一下:
注意到 ∑k|tnμ(k) 的值,当且仅当 tn=1 的时候,即 t=n 的时候 ∑k|tnμ(k)=1
其余时刻都等于0.
那么我们知道:
这样把 t=n 带入之后就证明完毕了。
重新回顾下两个公式:
然后就可以刷水题辣,开心。
据说,只需要
∑d|nμ(n)=[n=1]
就可以做题了。
真的么……?
显然是真的呀QAQ
比如:
看上去好像变复杂了?
但是实际上是变简单了吧QAQ
你们绝对不会想到我在这里写关于欧拉函数的东西
1.求
pk
的欧拉函数值(p为素数):
显而易见,
pk
中与
pk
的
gcd
不为1的只有含有
p
的数,即:
∴φ(pk)=pk−pk−1
2.求
p∗q
的欧拉函数值(p和q互素)
感觉很显然是积性的但是好像真的只是民科思路……?
因为与
p∗q
互素的数既不能有
p
的因子,又不能有
即:既与
p
互素又与
那么把phi(p)的数和phi(q)的数进行组合即可。
3.经过上面的东西,我们知道:
那么我们可以在 O(n√) 的时间复杂度内计算一个数的欧拉函数。
在 O(n) 的时间内计算1~n的欧拉函数。
//计算单个数的phi值
int phi(int n)
{
int tmp = n;
for(int i = 2;i * i <= n;++ i)
{
if(n % i == 0)
{
while(n % i == 0)n /= i;
tmp = tmp / i * (i - 1);
}
}
if(n > 1)tmp = tmp / n * (n - 1);
return tmp;
}
线性筛的代码最后放出。
4.欧拉定理:
5.欧拉定理推论:
int m,n,mu[1000005],phi[10000005],cnt,p[20000005];
bool sp[10000005];
void Get()
{
int i,j;
phi[1] = mu[1] = 1;
phi[1] = 0;
n = 10000000;
for(i = 2;i <= n;++ i)
{
if(!sp[i])phi[i] = i - 1,mu[i] = -1,p[++ cnt] = i;
for(j = 1;j <= cnt && 1ll * i * p[j] <= n;++ j)
{
sp[p[j] * i] = 1;
if(!(i % p[j]))
{
phi[i * p[j]] = p[j] * phi[i];
mu[i * p[j]] = 0;
break;
}
else
{
mu[i * p[j]] = -mu[i];
phi[i * p[j]] = phi[i] * phi[p[j]];
}
}
}
}
Upd On 2016/8/29
三个问题:
1.Q次询问,每次询问a<=x<=b,c<=y<=d里面的(x,y) = k的有多少个。
题解:
把询问可以用容斥原理拆成四个。
这样就考虑[1,m],[1,n]里面有多少个gcd(i,j) = k.
即:
[1,m/k],[1,n/k]
里面有多少个gcd(i,j) = 1.
分块并维护莫比乌斯前缀和即可。
2.Q次询问,每次询问1<=x<=n,1<=y<=m里面的(x,y)为质数的有多少个。
显而易见可以筛 ∑p|Tμ(Tp) ,这样又可以分块了。
3.有一张n×m的数表,其第i行第j列(1 <=i <=n,1 <=j<= m)的数值为能同时整除i和j的所有自然数之和。Q次询问,每次给定a,计算数表中不大于a的数之和。
用主席树维护前缀和即可。(或许)
为什么没有代码呢……?
这个……
显然是我写错了啊。。。。