莫比乌斯反演

​ 对于两个定义域为非负整数的函数\(F(n)\)和\(f(n)\)

​ 若满足:\(F(n)=\sum\limits_{d|n}f(d)\),则反演得到\(f(n)=\sum\limits_{d|n}\mu(d)F(\frac n d)\);

\[\sum_{d\mid n}\mu(d)F(\frac n d)=
\sum_{d\mid n}\mu(d)\sum_{d'\mid (n/d)}f(d')=
\sum_{d'\mid n}f(d')\sum_{d|(n/d')}\mu(d)\\
\because根据下文\mu的性质,当且仅当n/d'=1时式子有值,此时d'=n,d=1\\
\therefore原式=f(n)*\mu(1)=f(n)
\]

​ 常用变式:若满足:\(F(n)=\sum\limits_{n|d}f(d)\),则反演得到\(f(n)=\sum\limits_{n|d}\mu(\frac d n)F(d)\) 。

\(\mu(i)\)函数(莫比乌斯函数)

​ 定义:

\[\mu(d)=\begin{cases}
1& d=1\\
(-1)^k& d=p_1p_2...p_k&(p_i为互异素数)\\
0& d=p_1p_2...p_k &(p_i为素数,但有重复,即存在平方因子)
\end{cases} d\in\mathbb{N}^*
\]

​ 按照定义用线性筛来求解:

​ 循环\(i\),判定\(i\)为素数时,令\(\mu(i)=-1\);

​ 筛到\(x\)时(\(x=i*p\)),若\(i|p\),则\(x\)有\(p^2\)这个因子,此时令\(\mu(x)=0\);

​ 否则\(i\nmid p\),则\(x\)的互异素数数量加1,则令\(\mu(x)=-\mu(i)\)

mu[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]){
lis[++cnt]=i;
mu[i]=-1;
}
for(int j=1;j<=cnt&&i*lis[j]<=n;j++){
vis[i*lis[j]]=1;
if(i%lis[j]==0){
mu[i*lis[j]]=0;
break;
}
mu[i*lis[j]]=-mu[i];
}
}

​ \(\mu(i)\)函数性质:(1)它是积性函数。

​ (2)对于\(n\in\mathbb{N}^*\):

\[\sum_{d\mid n}\mu(d)=\begin{cases}
1& n=1\\
0& else
\end{cases}
\]

\[\sum_{d|n}\frac{\mu(d)}{d}=\frac{\phi(n)}{n}
\]

求解应用

BZOJ2820 GCD

​ 给定\(n,m\),求满足\(1\le x\le n,1\le y\le m\) 且 \(gcd(x,y)\)为质数的\((x,y)\)有多少对.

​ 我们设出两个函数,使得它们满足反演变式的关系:\(F(d)\)表示\(d\mid gcd(x,y)\) 的有多少对,\(f(d)\) 表示\(gcd(x,y)=d\)的有多少对,其中\(1\le x\le n,1\le y\le m\).

​ 它们确实满足\(F(n)=\sum\limits_{n|d}f(d)\) . 故\(f(n)=\sum\limits_{n|d}\mu(\frac d n)F(d)\). 方便的是$$F(d)=\lfloor \frac n d\rfloor\lfloor\frac m d \rfloor $$,即每个数对可以看成\((d*x,d*y)\),然后考虑\(x\)和\(y\)的取值各有多少种,乘起来便是\(F(d)\) ,因此\(f(n)=\sum\limits_{n\mid d }\mu(\frac d n)\lfloor \frac n d\rfloor\lfloor\frac m d \rfloor\).

\[\begin{aligned}
ans&=\sum_{p}f(p)\\
&=\sum_{p}\sum_{p\mid d }\mu(\frac d p)\lfloor \frac n d\rfloor\lfloor\frac m d \rfloor\\
&=\sum_p\sum_{k=1}^{\lfloor min(n,m)/p\rfloor}\mu(\frac{kp}p)\lfloor\frac n {kp}\rfloor\lfloor\frac m {kp}\rfloor&枚举d的取值,用kp替代\\
&=\sum_{T=1}^{min(n,m)}\lfloor\frac n T\rfloor\lfloor\frac m T\rfloor\sum_{p\mid T}\mu(\frac T p) &令T=kp
\end{aligned}
\]

​ 令\(g(x)=\sum_\limits{p\mid x}\mu(\frac x p)\) ,那么现在的任务是求出所有的\(g(x)\). 考虑用线性筛的方式来求:

​ 循环\(i\), 判定\(i\)是质数时,令\(g(i)=\mu(1)=1\)

​ 筛到\(x\)时(\(x=i*P\)),若\(P\mid i\),则\(x\)有\(P^2\)这个因子,除非求值式中的\(p\)将\(x\)中的\(P^2\)除去,否则\(\mu(\frac x p)=0\),唯一一个有值的是当\(p=P\)时\(\mu(\frac x P)=\mu(i)\). 综合,\(g(x)=\mu(i)\)

​ 若\(P\nmid i\),则\(P\)与\(i\)互质。当\(p=P\)时,值是\(\mu(\frac {iP}P)=\mu(i)\)。

​ 当\(p\ne P\)时,循环的\(p\)和g(i)中循环的\(p\)是一样的 ,则$$且\sum_{p|x且p!=P}\mu(\frac xp)=\sum_{p|i}\mu(\frac i pP)=\sum_{p|i}\mu(\frac i p)\mu(P)=\mu(P)\sum_{p|i}\mu(\frac ip)=-1g(i)=-g(i)$$

​ 综合,\(g(x)=\mu(i)-f(i)\)

​ 于是用线性筛求出了\(g(x)\)

​ 回到答案的表达式\(ans=\sum\limits_{T=1}^{min(n,m)}\lfloor\frac n T\rfloor\lfloor\frac m T\rfloor\sum_{p\mid T}\mu(\frac T p)\),如果循环\(1...min(n,m)\)显然不够快,考虑\(\lfloor\frac n T\rfloor\lfloor\frac m T\rfloor\)的取值是根号级别的,对于每一组\(\lfloor\frac n T\rfloor\lfloor\frac m T\rfloor\)相等的\(l\leq T\leq r\),可以加快计算,将\(\lfloor\frac n T\rfloor\lfloor\frac m T\rfloor\)提取出来,那么这些\(T\)的贡献就是\(\lfloor\frac n T\rfloor\lfloor\frac m T\rfloor\sum\limits_{i=l}^rg(i)\),预处理出\(g(i)\)的前缀和即可。

#include <cstdio>
using namespace std;
const int N=10000001;
typedef long long ll;
int T,n,m;
int mu[N],g[N];
int vis[N],lis[N],cnt;
inline void swap(int &x,int &y){int t=x;x=y;y=t;}
inline int min(int x,int y){return x<y?x:y;}
int main(){
freopen("input.in","r",stdin);
mu[1]=1;
for(int i=2;i<N;i++){
if(!vis[i]){
lis[++cnt]=i;
mu[i]=-1;
g[i]=1;
}
for(int j=1;j<=cnt&&i*lis[j]<N;j++){
int p=lis[j],x=i*p;
vis[x]=1;
if(i%lis[j]==0){
mu[x]=0;
g[x]=mu[i];
break;
}
else{
mu[x]=-mu[i];
g[x]=mu[i]-g[i];
}
}
}
for(int i=1;i<N;i++) g[i]+=g[i-1];
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
if(n>m) swap(n,m);
ll ans=0;
for(int i=1,j;i<=n;i=j+1){
j=min(n/(n/i),m/(m/i));
ans+=1LL*(n/i)*(m/i)*(g[j]-g[i-1]);
}
printf("%lld\n",ans);
}
return 0;
}

【Learning】 莫比乌斯反演的更多相关文章

  1. hdu1695 GCD(莫比乌斯反演)

    题意:求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). 知识点: 莫比乌斯反演/*12*/ 线性筛求莫比乌 ...

  2. BZOJ 2154: Crash的数字表格 [莫比乌斯反演]

    2154: Crash的数字表格 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2924  Solved: 1091[Submit][Status][ ...

  3. BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 4032  Solved: 1817[Submit] ...

  4. Bzoj2154 Crash的数字表格 乘法逆元+莫比乌斯反演(TLE)

    题意:求sigma{lcm(i,j)},1<=i<=n,1<=j<=m 不妨令n<=m 首先把lcm(i,j)转成i*j/gcd(i,j) 正解不会...总之最后化出来的 ...

  5. 莫比乌斯函数筛法 & 莫比乌斯反演

    模板: int p[MAXN],pcnt=0,mu[MAXN]; bool notp[MAXN]; void shai(int n){ mu[1]=1; for(int i=2;i<=n;++i ...

  6. 【BZOJ-2440】完全平方数 容斥原理 + 线性筛莫比乌斯反演函数 + 二分判定

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2371  Solved: 1143[Submit][Sta ...

  7. POI2007_zap 莫比乌斯反演

    题意:http://hzwer.com/4205.html 同hdu1695 #include <iostream> #include <cstring> #include & ...

  8. hdu.5212.Code(莫比乌斯反演 && 埃氏筛)

    Code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  9. CSU 1325 莫比乌斯反演

    题目大意: 一.有多少个有序数对(x,y)满足1<=x<=A,1<=y<=B,并且gcd(x,y)为p的一个约数: 二.有多少个有序数对(x,y)满足1<=x<=A ...

随机推荐

  1. Windows核心编程&作业

    1. 作业内核对象 允许将进程组合在一起并创建一个"沙箱"来限制进程能够做什么.我们可以将作业内核对象想象成一个进程容器(即使只有一个进程也具有相当的重要性) 限制包括可以分配的最 ...

  2. C#高性能大容量SOCKET并发(八):通讯协议

    协议种类 开发Socket程序有两种协议类型,一种是用文本描述的,类似HTTP协议,定义字符集,好处是兼容性和调试方便,缺点是解析文本会损耗一些性能:一种是用Code加结构体,定义字节顺序,好处是性能 ...

  3. 汉诺塔python3函数编写和过程分析

    !/usr/bin/env python3 -- coding: utf-8 -- 利用递归函数计算阶乘 N! = 1 * 2 * 3 * ... * N def fact(n): if n == 1 ...

  4. rsync命令解释

    -v, --verbose 详细模式输出-q, --quiet 精简输出模式-c, --checksum 打开校验开关,强制对文件传输进行校验-a, --archive 归档模式,表示以递归方式传输文 ...

  5. Cacti在selinux开启的情况下使用

    # chcon -R -t httpd_sys_content_t /var/www/html/cacti

  6. GitHub For Beginners: Commit, Push And Go

    In Part 1 of this two-part GitHub tutorial, we examined the main uses for GitHub and bega5n the proc ...

  7. 关于if和else嵌套—蛋疼

    嵌套使用的时候else if和else遵循就近原则,和上面最靠近该语句的if语句匹配,要把else if看成是一个整体.就这么干,这样好理解一点. 一个if...else if...else语句中可以 ...

  8. Linux下查看CPU、内存和硬盘信息命令

    一.查看cpu信息 cat /proc/cpuinfo 相同physical id 的记录是属于同一个CPU的,对应于多核的信息. 二.查看内存的信息 cat /proc/meminfo 三.查看硬盘 ...

  9. jquery参考手册

    开始使用 jQueryjQuery 本身只有一个 js 文件,所以,要使用它,就和使用其它的 js 文件一样,直接将它引入就可以使用了. <script type="text/java ...

  10. windows搭建web服务器

    1.安装web管理工具 控制面板--->程序和功能--->打开或关闭功能 2.将internet信息服务中的所有选项全部勾上,并点击确定. 3.打开浏览器,输入http://localho ...