莫比乌斯函数&莫比乌斯反演
前置知识
带*表示如果只是学会可以不会这个知识点,但是较难的题目里面需要用到。
狄利克雷卷积
详见数论函数&狄利克雷卷积。
线性筛
详见线性筛
整除分块
详见整除分块
*杜教筛
详见杜教筛
莫比乌斯函数
莫比乌斯函数的定义
莫比乌斯函数的积性
莫比乌斯函数是个积性函数,但是不是完全积性函数。
也就是说有:
证明:
分类讨论:
先讨论两者至少一个满足第三个情况的:
因为 \(0\) 和任何数相乘都是 \(0\) ,那么显然左侧是 \(0\) ,对于右侧:
有一个数的素因数最高次幂 \(> 1\),那么代表这个乘积的素因数最高次幂也一定 \(>1\) ,那么肯定会取到 \(0\) 。
接下来讨论 \(n,m\) 都不满足第三个情况的:
存在至少一个第一种情况的时候很好讨论,这里略去。
这里讨论两个都是第二种情况的时候:
因为 \(n,m\) 互质,所以它们没有相同的素因子,于是:
设 \(\large n=\prod\limits_{i=1}^{k_1}p_{i_1}^{a_{i_1}},m=\prod\limits_{i=1}^{k_2}p_{i_2}^{a_{i_2}}\)
那么 \(nm\) 就可以写成:
\(\large nm=\prod\limits_{i=1}^{k_1}p_{i_1}^{a_{i_1}}\prod\limits_{i=1}^{k_2}p_{i_2}^{a_{i_2}}=\prod\limits_{i=1}^{k_1+k_2}p_{i_3}^{a_{i_3}}\)
而且这里的所有 \(a_{i_3}\) 都是 \(1\) 。
那么就变成了讨论 \(k_1+k_2\) 的奇偶性,这时,我们可以观察到,如果出现第一种情况,那么其实可以看做是 \(k=0\) 的,而 \(k\) 为偶数的时候又恰好 \((-1)^k=1\) 。
也就是说,如果 \(k_1\) 和 \(k_2\) 奇偶性相同,那么等式左边只能是 \((-1)\times (-1)=1\) 或者 \(1\times 1=1\) ,这时等式右边也恰好是 \(1\)
如果不同,那么等式左边也只能是 \((-1)\times 1=-1\) ,这时等式右边也恰好是 \(-1\)
\(Q.E.D.\)
莫比乌斯函数常见性质
\(\mu * I=\varepsilon,\ \ \ \mu*id=\varphi, \ \ \ \mu * d=I\)
写成和式也就是:
证明略。
莫比乌斯函数常见求法
线性筛
int prime[N],mu[N],cnt,pre[N],val[N];
bool isprime[N];
void GetPrimes(int v){
mu[1]=pre[1]=1;
for(int i=2;i<=v;i++){
if(!isprime[i]) prime[++cnt]=i,mu[i]=-1;
pre[i]=pre[i-1]+mu[i];
for(int j=1;j<=cnt&&prime[j]*i<=v;j++){
isprime[i*prime[j]]=true;
if(i%prime[j]==0) break;
mu[i*prime[j]]=-mu[i];
}
}
return ;
}
分解质因数
直接按照定义暴力分解质因数即可。
代码:
#define ll long long
#define ull unsigned long long
#define ld long double
inline ll mul(ll x,ll y,ll mod){
ll res=x*y-mod*(ll)((ld)x/mod*y);
if(res<0)return res+mod;
if(res<mod)return res;
return res-mod;
}
ll QuickPow(ll x,ll y){
ll res=1;
for(;y;y>>=1,x=x*x%MOD) if(y&1) res=res*x%MOD;
return res;
}
ll Quick_Pow(ll x,ll y,ll mod=-1){
ll res=1;
for(;y;y>>=1,x=mul(x,x,mod)) if(y&1) res=mul(res,x,mod);
return res;
}
ll test[3]={2,61};
inline bool Miller_Rabin(ll x){
if(x==1) return false;
ll t=x-1,k=0;
while(!(t&1)) t>>=1,k++;
for(int i=0;i<2;i++){
if(x==test[i]) return true;
ll a=Quick_Pow(test[i],t,x),Nex=a;
for(int j=1;j<=k;j++){
Nex=mul(a,a,x);
if(Nex==1&&a!=1&&a!=x-1) return false;
a=Nex;
}
if(a!=1) return false;
}
return true;
}
inline bool prime(ll x){
if(x==46856248255981ll||x<2)return false;
if(x==2||x==3||x==7||x==61||x==24251) return true;
return Miller_Rabin(x);
}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
inline ll f(ll x,ll c,ll mod){
ll res=mul(x,x,mod)+c;
return res<mod?res:res-mod;
}
inline ll Pollard_Rho(ll x){
ll c=rand()%(x-1),s=0;
for(ll lim=1;;lim<<=1){
ll t=s,now=1;
for(ll j=1;j<=lim;j++){
s=f(s,c,x);
now=mul(now,abs(s-t),x);
if(!now){ll d=gcd(s,x);if(d>1)return d;return x;}
if(j%127==0){ll d=gcd(now,x);if(d>1)return d;}
}
ll d=gcd(s,x);
if(d>1) return d;
}
}
ll Maxn;
ll t[N],q,id,fl;
map<int,int>Map;
inline void GetFact(ll x){
if(fl) return ;
if(x<=1) return ;
if(prime(x)){
if(Map[x]) fl=true;
Map[x]=1;id++;
return ;
}
ll p=Pollard_Rho(x);
while(p>=x) p=Pollard_Rho(x);
GetFact(x/p),GetFact(p);
return ;
}
inline int mu(int x){
fl=false;id=0;map<int,int>mapp;swap(mapp,Map);
GetFact(x);
if(fl) return 0;
return ((id&1)?-1:1);
}
莫比乌斯反演
对于两个定义在非负整数域上的两个函数 \(f(n)\) 和 \(g(n)\)
子集形式(因数形式)
公式
如果满足:
那么有:
证明1
证明2(狄利克雷卷积)
已知 \(f=g*I\) ,证明 \(g=f*\mu\)
易知如下转化:\(f*\mu=g*I*\mu\Rightarrow f*\mu=g\)
超集形式(倍数形式)
公式
如果满足:
那么有:
证明
莫比乌斯函数/反演基础应用
求 gcd 为某个数的数对个数
问题
求
结论
分析
也就是一般有这样的套路,设函数 \(g(d)\) 为:
这时我们可以观察我们的函数 \(f\) :
发现这时的 \(f\) 函数性质非常好,就相当于取两个数使得他们都是 \(d\) 的倍数,可以直接写出:
然后我们尝试通过莫比乌斯反演来求出 \(g\) 就是利用 \(f\) :
那么就是:
然后我们换成直接枚举这个倍数 \(\large t=\frac dn\) :
那么对于这个柿子可以应用整除分块来处理后半部分,然后预处理一下 \(\mu\) 的前缀和即可在 \(\sqrt{N}\) 的复杂度做到 \(O(n)\) 预处理的单次询问
注意这里的整除分块:
其实我们不是按照 \(tn\) 来分块(这样我就不会处理 \(\mu\) 里面的东西了),而是 \(t\) 来分块。
要把柿子转化成这样:
\[\large g(n)=\sum\limits_{t=1}^{\min(N,M)} \mu(t) \lfloor\dfrac{\lfloor\frac N{t}\rfloor}{n}\rfloor\lfloor\dfrac{\lfloor\frac M{t}\rfloor}{n}\rfloor \]然后这个时候以 \(t\) 来分块看上去就很没有问题了,因为变量只有 \(t\) ,和 \(n\) 没有关系,我们只关注分子的变化即可。
接下来可以注意这样的分块,其实就等价于 \(N,M\) 都来分块,分了很多个隔板,然后块的个数也就是 \(2\sqrt{N}\) 级别了。
也就是每次取 \(r\) 的时候取两者算出来较小的右端点。
求 gcd 为质数的数对个数
问题
也就是求:
结论
分析
根据结论,那么直接把后半写成:
然后转为枚举 \(d\) :
那么最后那个柿子可以通过一点小办法处理出来,然后前面就是整除分块。
后面那个可以这样做:考虑每一个质数 \(k\) ,对于 \(k\) 的倍数 \(T\) ,将它的值加上 $ \mu(\frac{T}{k})$
例题
CF900D Unusual Sequences
给定一个序列的 \(\gcd\) 和 \(sum\) ,求这样的序列个数。
P3455 [POI2007]ZAP-Queries
求:
其中 \(n,m,k\le 5\times 10^4\) ,\(t\le 5\times 10^4\) 组数据。
P2257 YY的GCD
求:
\(T=10^4,n, m \leq 10^7\)
题目:P2257 YY的GCD
解答:P2257 YY的GCD
扩展
还有一大堆多题没写...