容斥原理
容斥原理
- 内容
用于解决多个有相交情况的集合的并集,例如三个集合的情形:
对于n个集合的交集有公式:
即:奇数个集合相交前面的系数为正,偶数个集合相交系数为负。
- 数学证明
若证:
只需证:对于任意一个其中的元素x,其属于n个集合中的k个,都有: 即可,我们发现对于 二项式展开有: ,证毕。 - 代码实现
给定一个n和m个不同的质数 ,求出1-n中至少能被一个P整除的数有多少个。
#include<iostream>
using namespace std;
typedef long long LL;
const int M=20;
int p[M];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++)
{
int x;
scanf("%d",&x);
p[i]=x;
}
int res=0;
for(int i=1;i<1<<m;i++)//将所有质数选择情况用1-(2^m-1)的二进制数这2^m-1种情况表示,其中1代表选了这个质数,0表示没选
{
int t=1,cnt=0;
for(int j=0;j<m;j++)
{
if(i>>j&1)
{
if((LL)t*p[j]>n)
{
t=-1;
break;
}
t*=p[j];
cnt++;
}
}
if(t!=-1)
{
if(cnt%2)
{
res+=n/t;
}
else
{
res-=n/t;
}
}
}
printf("%d\n",res);
return 0;
}
- 代码思路及细节
由数学知识显然有:1-n中能被 整除的数有 个,且1-n中能被 同时整除的数有 个,以此类推:1-n中能被 整除的数有 个。
对于质数选择的表示我们用了一个小技巧,就是用 这 个数的二进制来表示,1表示选了这个质数,0代表没有选,例如101就表示选了第一个和第三个质数来求它们在1~n至少能被其中一个数整除的数有多少个。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具