莫比乌斯反演入门 学习笔记

前言

久仰其大名,近日学之,知不易。

引入

【BZOJ2820】 YY的GCD

给定 n , m n,m n,m,求 1 ≤ x ≤ n 1≤x≤n 1xn, 1 ≤ y ≤ m 1≤y≤m 1ym g c d ( x , y ) gcd(x,y) gcd(x,y)为质数的 ( x , y ) (x,y) (x,y)有多少对。

若暴力枚举之,时间复杂度过 θ ( n 2 ) \theta(n^2) θ(n2),附线性欧筛预处理,炸哉。
因不得使,习莫比乌斯反演,旋过之。

附代码

//恰同学少年,风华正茂;书生意气,挥斥方遒。
#include<bits/stdc++.h>
 
using namespace std;
 
const int N=1e7+10;
const int NN=1e7;
 
bool vis[N];
int sjs, p[N], miu[N], cnt, n, m;
long long F[N];
 
inline void init() {
    memset(vis, 0, sizeof(vis));
    int i, j; cnt=0;
    //phi[1]=1;
    miu[1]=1;
    for(i=2; i<=NN; i++) {
        if(!vis[i]) {
            p[++cnt]=i;
            miu[i]=-1;
            //phi[i]=i-1;
        }
        for(j=1; j<=cnt&&i*p[j]<=NN; j++) {
            vis[i*p[j]]=1;
            if(i%p[j]==0) {
                miu[i*p[j]]=0;
                //phi[i*p[j]]=phi[i]*p[j];
                break;
            }
            miu[i*p[j]]=-miu[i];
            //phi[i*p[j]]=phi[i]*phi[p[j]];
        }
    }
}
 
inline void getit() {
    for(int i=1;i<=cnt;i++){
        int p1=p[i];
        for(int j=1;j*p1<=NN;j++) {
            F[j*p1]+=miu[j];
        }
    }
    for(int i=1; i<=NN; i++) {
        F[i]+=F[i-1];
    }
}
 
int main() {
    init();
    getit();
    scanf("%d", &sjs);
    while(sjs--) {
        scanf("%d%d", &n, &m);
        if(n>m) swap(n, m);
        long long ans=0;
        for(int i=1, j; i<=n; i=j+1) {
            j=min(n/(n/i), m/(m/i));
            ans+=(F[j]-F[i-1])*(n/i)*(m/i);
        }
        printf("%lld\n", ans);
    }
}

简介

习此前,观一函数。
F ( n ) = Σ d ∣ n f ( d ) F(n)=Σ_{d|n}f(d) F(n)=Σdnf(d)
据此定义,便有
F ( 1 ) = f ( 1 ) F(1)=f(1) F(1)=f(1)
F ( 2 ) = f ( 1 ) + f ( 2 ) F(2)=f(1)+f(2) F(2)=f(1)+f(2)
F ( 3 ) = f ( 1 ) + f ( 3 ) F(3)=f(1)+f(3) F(3)=f(1)+f(3)
F ( 4 ) = f ( 1 ) + f ( 2 ) + f ( 4 ) F(4)=f(1)+f(2)+f(4) F(4)=f(1)+f(2)+f(4)
. . . . . . ...... ......
移项得
f ( 1 ) = F ( 1 ) f(1)=F(1) f(1)=F(1)
f ( 2 ) = F ( 2 ) − F ( 1 ) f(2)=F(2)-F(1) f(2)=F(2)F(1)
f ( 3 ) = F ( 3 ) − F ( 1 ) f(3)=F(3)-F(1) f(3)=F(3)F(1)
f ( 4 ) = F ( 4 ) − F ( 2 ) f(4)=F(4)-F(2) f(4)=F(4)F(2)
. . . . . . ...... ......
问君何所得?不过此公式矣。
F ( n ) = Σ d ∣ n f ( d ) F(n)=Σ_{d|n}f(d) F(n)=Σdnf(d)
=> f ( n ) = Σ d ∣ n μ ( d ) F ( n d ) f(n)=Σ_{d|n}μ(d)F(\frac{n}{d}) f(n)=Σdnμ(d)F(dn)
此为莫比乌斯反演之基础变换。

莫比乌斯函数

问曰:“何为函数μ?”
答曰:“不过莫比乌斯函数矣。”
在这里插入图片描述
我不想打LaTeX了

此可线性推,详见代码。

欧拉函数

变态 μ μ μ,还需要 φ φ φ函数即欧拉函数

在数论中,对正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目

此同可线性推

基本公式

仅个人总结,如有误,欢迎提。

公式一
[ g c d ( i , j ) = 1 ] = ∑ d ∣ g c d ( i , j ) μ ( d ) [gcd(i,j)=1]=\sum_{d|gcd(i,j)}\mu(d) [gcd(i,j)=1]=dgcd(i,j)μ(d)
(因为 ∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d|n}\mu(d)=[n=1] dnμ(d)=[n=1]

公式二
∑ d = 1 n [ g c d ( d , n ) = 1 ] = φ ( n ) ∑_{d=1}^n[gcd(d, n)=1]=φ(n) d=1n[gcd(d,n)=1]=φ(n)
(根据定义)

∑ ∑ 提、代之公式则不言矣。

解题基本步骤

同样仅个人总结
1.列公式
2.推公式
3.推标准函数
4.推自定函数 F ( x ) F(x) F(x)
5.证明 F ( x ) F(x) F(x)可乘。

后记

多做题,则知其术之妙。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值