容斥与简单莫反
容斥与莫比乌斯函数
容斥原理:
介绍:设集合
所以由容斥原理可以得到之前的多重集的组合数公式:
设集合
则从该集合中选出
对于容斥原理在代码中的实现:我们可以枚举
Mobius函数
莫比乌斯函数是一个容斥系数,与容斥原理息息相关
定义:设
则称
对于mobius函数的求法:
如果只是求一个数的莫比乌斯函数,分解质因数即可,若是求
for(int i=1;i<=n;i++)mui[i]=1,vis[i]=0;
for(int i=2;i<=n;i++){
if(vis[i])continue;
mui[i]=-1;
vis[i]=1;
for(int j=2;j*i<=n;j++){
mui[i*j]*=-1;
if(j%i==0)mui[i*j]=0;
vis[i*j]=1;
}
}
性质:
1.对于任意正整数n,
2.若
莫比乌斯函数与容斥原理的关系:
即对
随意扔一道例题:
ZAP-Queries
[POI2007]ZAP-Queries
题目描述
密码学家正在尝试破解一种叫 BSA 的密码。
他发现,在破解一条消息的同时,他还需要回答这样一种问题:
给出
因为要解决的问题实在太多了,他便过来寻求你的帮助。
输入格式
输入第一行一个整数
接下来
输出格式
对于每组询问,输出一个整数代表答案。
数据规模与约定
对于全部的测试点,保证
分析:
求有多少对二元组
设
设
上式含义:当
又联系我们之前学习的数论分块的知识
#define int long long
int T,n,a,b,d,mobius[50005],sum[50005];
bool vis[50005];
void init(){
for(int i=1;i<=50000;i++)mobius[i]=1;
for(int i=2;i<=50000;i++){
if(!vis[i]){
mobius[i]=-1;
for(int j=2;j*i<=50000;j++){
vis[j*i]=1;
mobius[i*j]= j%i==0?0:-mobius[i*j];
}
}
}
for(int i=1;i<=50000;i++)sum[i]=sum[i-1]+mobius[i];
}
int get(int a,int x){
return a/(a/x);
}
signed main(){
init();
scanf("%lld",&T);
while(T--){
int ans=0;
scanf("%lld%lld%lld",&a,&b,&d);
a/=d,b/=d;
n=min(a,b);
for(int l=1,r;l<=n;l=r+1){
r=min(n,min(get(a,l),get(b,l)));
ans+=(sum[r]-sum[l-1])*(a/l)*(b/l);
}
printf("%lld\n",ans);
}
return 0;
}
莫比乌斯反演定理
仅作了解,tg无需掌握
设函数
形式1
若函数
则:
形式2
若函数
则有
推一个大佬博客“浅谈”莫反
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!