莫比乌斯反演专题

莫比乌斯函数

首先把 n n n按照唯一分解定理变成 ∏ i = 1 k p i c i \large\prod_{i=1}^{k}p_i^{c_i} i=1kpici
那么若 ∀ x ∈ p \forall x\in p xp
μ ( n ) = { 1 [ n = = 1 ] 0 [ n   m o d   x 2 = = 0 ] ( − 1 ) k \mu(n)=\begin{cases}1[n==1]\\0[n\bmod x^2==0]\\(-1)^k\end{cases} μ(n)=1[n==1]0[nmodx2==0](1)k
那么就可以用线性筛来解决,代码

inline void init(){
    mu[1]=1; register int m=0;
    for (register int i=2;i<=N;++i){
        if (!v[i]) v[i]=i,prime[++m]=i,mu[i]=-1;
        for (register int j=1;j<=m&&prime[j]*i<=N;++j){
            v[prime[j]*i]=prime[j];
            if (i%prime[j]==0) break;
            mu[prime[j]*i]=-mu[i];
        }
    }
}

整除分块

Example

∑ i = 1 n ⌊ n i ⌋ \sum_{i=1}^n\lfloor\frac{n}{i}\rfloor i=1nin


分析

可以感性理解,一个数 n n n最多有 2 n 2\sqrt n 2n 中取值,那么其实只有 2 n 2\sqrt n 2n 次枚举是有意义的;
当然,也可以理解成只有正好 ⌊ n i ⌋ = n i \large\lfloor\frac{n}{i}\rfloor=\frac{n}{i} in=in才是需要枚举的,
因为其它取值都可以等同于下取整,所以枚举 n n n的约数个数次是最优的,不管怎样,其实也是容易理解的


代码

register int ans=0;
for (register int l=1,r;l<=k;l=r+1){
    r=n/(n/l);
    ans+=(r-l+1)*(n/l);
}

相关
洛谷 2261 余数之和
洛谷 1447 能量采集(我知道可以 O ( n ) O(n) O(n)过)
洛谷 3935 Calculating ≈ \approx 洛谷 2424 约数和
洛谷 2280 模积和 ≈ \approx 洛谷 2834 能力测验

莫比乌斯函数的性质

  1. ∑ d ∣ n μ ( d ) = [ n = = 1 ] \sum_{d|n}\mu(d)=[n==1] dnμ(d)=[n==1]可以通过容斥证明
  2. ∑ d ∣ n μ ( d ) d = φ ( n ) n \sum_{d|n}\frac{\mu(d)}{d}=\frac{\varphi(n)}{n} dndμ(d)=nφ(n)先设置悬念

莫比乌斯反演

F ( n ) F(n) F(n) f ( n ) f(n) f(n)是非负整数集合中的两个函数,且满足
F ( n ) = ∑ d ∣ n f ( d ) F(n)=\sum_{d|n}f(d) F(n)=dnf(d)
那么
f ( n ) = ∑ d ∣ n μ ( d ) F ( n d ) f(n)=\sum_{d|n}\mu(d)F(\frac{n}{d}) f(n)=dnμ(d)F(dn)
证明:
∑ d ∣ n μ ( d ) F ( n d ) = ∑ d ∣ n μ ( d ) ∑ k ∣ n d f ( k ) = ∑ k ∣ n f ( k ) ∑ d ∣ n k μ ( d ) = f ( n ) \sum_{d|n}\mu(d)F(\frac{n}{d})=\sum_{d|n}\mu(d)\sum_{k|\frac{n}{d}}f(k)=\sum_{k|n}f(k)\sum_{d|\frac{n}{k}}\mu(d)=f(n) dnμ(d)F(dn)=dnμ(d)kdnf(k)=knf(k)dknμ(d)=f(n)


积性函数

定义

对于一个数论函数 f f f,且 f ( 1 ) = 1 f(1)=1 f(1)=1,满足任意两个互质的整数 p , q p,q p,q都满足 f ( p q ) = f ( p ) × f ( q ) f(pq)=f(p)\times f(q) f(pq)=f(p)×f(q),那么这个函数就是积性函数
特别地,若任意整数 p , q p,q p,q都满足 f ( p q ) = f ( p ) × f ( q ) f(pq)=f(p)\times f(q) f(pq)=f(p)×f(q),那么就是完全积性函数

Example(积性函数)
莫比乌斯函数: μ ( n ) \mu(n) μ(n)
欧拉函数: φ ( n ) = ∑ i = 1 n [ g c d ( n , i ) = = 1 ] \large\varphi(n)=\sum_{i=1}^n[gcd(n,i)==1] φ(n)=i=1n[gcd(n,i)==1];欧拉定理 ∑ n &VeryThinSpace; m o d &VeryThinSpace; d = 0 φ ( d ) = n \large\sum_{n\bmod d=0}\varphi(d)=n nmodd=0φ(d)=n
约数个数: d ( n ) = ∑ i = 1 n [ n &VeryThinSpace; m o d &VeryThinSpace; i = = 0 ] d(n)=\sum_{i=1}^n[n\bmod i==0] d(n)=i=1n[nmodi==0]
约数和函数: σ ( n ) = ∑ n &VeryThinSpace; m o d &VeryThinSpace; i = 0 i \sigma(n)=\sum_{n\bmod i=0}i σ(n)=nmodi=0i
以下是完全积性函数
元函数: ϵ ( n ) = [ n = = 1 ] \epsilon(n)=[n==1] ϵ(n)=[n==1];怎么如此熟悉?!
恒等函数: I ( n ) = 1 I(n)=1 I(n)=1
单位函数: i d ( n ) = n id(n)=n id(n)=n

好像都没用啊,其实用处大着呢


狄利克雷卷积

定义

两个数论函数 f , g f,g f,g的卷积为 ( f ∗ g ) ( n ) = ∑ d ∣ n f ( d ) ∗ g ( n d ) (f*g)(n)=\sum_{d|n}f(d)*g(\frac{n}{d}) (fg)(n)=dnf(d)g(dn),一般后面括号省略不写,默认为 n n n
感性理解,它满足交换律、结合律和分配率,即
交换律: ( f ∗ g ) = ( g ∗ f ) (f*g)=(g*f) (fg)=(gf)
结合律: ( ( f ∗ g ) ∗ h ) = ( f ∗ ( g ∗ h ) ) ((f*g)*h)=(f*(g*h)) ((fg)h)=(f(gh))
分配率: ( ( f + g ) ∗ h ) = ( f ∗ h ) + ( g ∗ h ) ((f+g)*h)=(f*h)+(g*h) ((f+g)h)=(fh)+(gh)
可以知道 ( f ∗ ϵ ) = f (f*\epsilon)=f (fϵ)=f


证明性质

换一种方法证明莫比乌斯反演
f ( n ) = ∑ d ∣ n F ( d ) × μ ( n d ) f(n)=\sum_{d|n}F(d)\times \mu(\frac{n}{d}) f(n)=dnF(d)×μ(dn)
已知 F ( n ) = ∑ d ∣ n f ( d ) F(n)=\sum_{d|n}f(d) F(n)=dnf(d)
也就是 F = ( f ∗ I ) F=(f*I) F=(fI)
同时卷上 μ \mu μ得到
F ∗ μ = f ∗ I ∗ μ F*\mu=f*I*\mu Fμ=fIμ
已知 ∑ d ∣ n μ ( d ) = [ n = = 1 ] \sum_{d|n}\mu(d)=[n==1] dnμ(d)=[n==1]
也就是 μ ∗ I = ϵ \mu*I=\epsilon μI=ϵ
所以 F ∗ μ = f ∗ ϵ = f F*\mu=f*\epsilon=f Fμ=fϵ=f
所以 f = F ∗ μ f=F*\mu f=Fμ


再来证明 ∑ d ∣ n μ ( d ) d = φ ( n ) n \sum_{d|n}\frac{\mu(d)}{d}=\frac{\varphi(n)}{n} dndμ(d)=nφ(n)
根据欧拉定理 ∑ d ∣ n φ ( d ) = n \sum_{d|n}\varphi(d)=n dnφ(d)=n
也就是 φ ∗ I = i d \varphi*I=id φI=id
同乘 μ \mu μ得到
φ ∗ I ∗ μ = i d ∗ μ \varphi*I*\mu=id*\mu φIμ=idμ
所以 φ ∗ ϵ = φ = i d ∗ μ \varphi*\epsilon=\varphi=id*\mu φϵ=φ=idμ
φ ( n ) = ∑ d ∣ n d ∗ μ ( n d ) \varphi(n)=\sum_{d|n}d*\mu(\frac{n}{d}) φ(n)=dndμ(dn)
同除 n n n得到
φ ( n ) n = ∑ d ∣ n μ ( d ) d \frac{\varphi(n)}{n}=\sum_{d|n}\frac{\mu(d)}{d} nφ(n)=dndμ(d)
这有什么用吗??等到杜教筛狄利克雷卷积就很重要了,然而在这里不是重点
对了,一大重点就是两个积性函数的狄利克雷卷积仍然是一个积性函数,对于一个积性函数,可以分解质因数,分别处理每个质数及其指数的幂的答案再相乘


Bzoj 3601 一个人的数论

题目

已知 f d ( n ) f_d(n) fd(n)表示所有小于 n n n且与 n n n互质的正整数的 d d d次方的和,给出 n = ∏ i = 1 c n t p i c i n=\prod_{i=1}^{cnt}p_i^{c_i} n=i=1cntpici,和 d d d,求 f d ( n ) &VeryThinSpace; m o d &VeryThinSpace; 1000000007 f_d(n)\bmod 1000000007 fd(n)mod1000000007


分析

那么 f d ( n ) = ∑ i = 1 n i d ∗ [ g c d ( n , i ) = = 1 ] f_d(n)=\sum_{i=1}^ni^d*[gcd(n,i)==1] fd(n)=i=1nid[gcd(n,i)==1]
根据 ∑ k ∣ n μ ( k ) = [ n = = 1 ] \sum_{k|n}\mu(k)=[n==1] knμ(k)=[n==1](非常有用)
得到 f d ( n ) = ∑ i = 1 n i d ∗ ( ∑ k ∣ n , k ∣ i μ ( k ) ) f_d(n)=\sum_{i=1}^ni^d*(\sum_{k|n,k|i}\mu(k)) fd(n)=i=1nid(kn,kiμ(k))
f d ( n ) = ∑ k ∣ n ∑ i = 1 n [ k ∣ i ] i d μ ( k ) f_d(n)=\sum_{k|n}\sum_{i=1}^n[k|i]i^d\mu(k) fd(n)=kni=1n[ki]idμ(k)
f d ( n ) = ∑ k ∣ n ∑ i = 1 ⌊ n k ⌋ ( k i ) d μ ( k ) \large f_d(n)=\sum_{k|n}\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}(ki)^d\mu(k) fd(n)=kni=1kn(ki)dμ(k)
f d ( n ) = ∑ k ∣ n μ ( k ) k d ∑ i = 1 ⌊ n k ⌋ i d f_d(n)=\sum_{k|n}\mu(k)k^d\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}i^d fd(n)=knμ(k)kdi=1knid
后面这个东西把它变成 s ( n ) s(n) s(n),感性理解,是一个关于 n n n d + 1 d+1 d+1次多项式,也就是可以表示成 ∑ i = 0 d + 1 a i n i \sum_{i=0}^{d+1}a_in^i i=0d+1aini,其中 a i a_i ai可以高斯消元得到
那么 f d ( n ) = ∑ i = 0 d + 1 a i ∑ k ∣ n μ ( k ) k d ( n k ) i f_d(n)=\sum_{i=0}^{d+1}a_i\sum_{k|n}\mu(k)k^d(\frac{n}{k})^i fd(n)=i=0d+1aiknμ(k)kd(kn)i
后面这坨变成了狄利克雷卷积,可以用积性函数解决
也就是若 g ( k ) = ∑ k ∣ n μ ( k ) k d ( n k ) i g(k)=\sum_{k|n}\mu(k)k^d(\frac{n}{k})^i g(k)=knμ(k)kd(kn)i
n n n质因数分解,分别求出单个质数的指数次幂的答案再相乘
g ( p t ) = ∑ j = 0 t μ ( p j ) p d j p ( t − j ) i g(p^t)=\sum_{j=0}^t\mu(p^j)p^{dj}p^{(t-j)i} g(pt)=j=0tμ(pj)pdjp(tj)i
因为 { μ ( p 0 ) = 1 μ ( p 1 ) = − 1 o t h e r w i s e μ ( p t ) = 0 \begin{cases}\mu(p^0)=1\\ \mu(p^1)=-1\\otherwise\mu(p^t)=0\end{cases} μ(p0)=1μ(p1)=1otherwiseμ(pt)=0
所以 g ( p t ) = p t i − p d p ( t − 1 ) i = p t i ( 1 − p d − i ) g(p^t)=p^{ti}-p^dp^{(t-1)i}=p^{ti}(1-p^{d-i}) g(pt)=ptipdp(t1)i=pti(1pdi)


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int mod=1000000007;
int b[1011][2],a[111][111],c[111],m,n,ans;
inline signed iut(){
    rr int ans=0; rr char c=getchar();
    while (!isdigit(c)) c=getchar();
    while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
    return ans;
}
inline void swap(int &a,int &b){rr int t=a;a=b,b=t;}
inline signed ksm(int x,int y){
    rr int ans=1;
    for (;y;y>>=1,x=1ll*x*x%mod)
        if (y&1) ans=1ll*ans*x%mod;
    return ans;
}
inline void init(){
    for (rr int i=0;i<m+2;++i){
        a[i][0]=1;
        for (rr int j=1;j<m+2;++j) a[i][j]=1ll*a[i][j-1]*(i+1)%mod;
        a[i][m+2]=a[i][m]+(i>0?a[i-1][m+2]:0),a[i][m+2]-=mod*(a[i][m+2]>=mod);
    }
    for (rr int i=0;i<m+2;++i){
        for (rr int j=i;j<m+2;++j) if (a[j][i])
            for (rr int k=0;k<m+3;++k) swap(a[i][k],a[j][k]);
        for (rr int j=0;j<m+2;++j) if (i!=j&&a[j][i]){
            rr int elim=1ll*a[j][i]*ksm(a[i][i],mod-2)%mod;
            for (rr int k=i;k<m+3;++k)
                a[j][k]=a[j][k]-1ll*a[i][k]*elim%mod,a[j][k]+=mod*(a[j][k]<0);
        }
    }
    for (rr int i=0;i<m+2;++i)
        c[i]=1ll*a[i][m+2]*ksm(a[i][i],mod-2)%mod;
    return;
}
signed main(){
    m=iut(); n=iut(); init();
    for (rr int i=1;i<=n;++i) b[i][0]=iut(),b[i][1]=iut();
    for (rr int i=0;i<m+2;++i){
        rr int mul=1;
        for (rr int j=1;j<=n;++j)
            mul=1ll*mul*ksm(b[j][0],1ll*b[j][1]*i%(mod-1))%mod,
            mul=1ll*mul*(mod+1-ksm(b[j][0],m-i+(mod-1)*(m<i)))%mod;
        mul=1ll*mul*c[i]%mod,ans=ans+mul-mod*(ans+mul>=mod);
    }
    return !printf("%d",ans+mod*(ans<0));
}

爱做不做

练习
洛谷 2257 YY的GCD
洛谷 3455 ZAP-Queries
洛谷 4318 完全平方数
洛谷 2522 Problem B
洛谷 3327 约数个数和
洛谷 1829 Crash的数字表格
洛谷 3312 数表
以下是黑题
洛谷 4466 和与积
洛谷 3704 数字表格

我的博客都写了题解


后续

参考于pengym的杜教筛

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值