当前位置: 首页 > news >正文

容斥原理

1. 定义

N个集合,称为 S[1],s[2]...s[n] ,则这N个集合的并集为

image

假如有N个毫不相干的约束条件,那么可以将所有满足某个约束条件的状态看作一个集合,这样用容斥原理就可以很轻松地求出所有满足至少一个约束条件的状态总数

2. 题目

洛谷P1287 盒子与球
https://www.luogu.com.cn/problem/P1287

由于盒子互不相同,可以将第i个盒子为空看作一个约束条件,这样可以求出至少有一个空盒的状态总数,再用总答案减去不合法答案就行了

image

点击查看代码
#include <iostream>
using namespace std;
int qpow(int a,int b){int res=1;while(b){if(b&1){res=res*a;} a=a*a;b=(b>>1);}return res;
}
int c(int a,int b){int res=1;for(int i=a;i>=a-b+1;i--){res*=i;}for(int i=b;i>=1;i--){res/=i;}return res;
}
int main(){int n,m;cin>>n>>m;int ans=0;//不合法方案 int opt=1;for(int i=1;i<=m;i++){//至少i个空盒 ans+=opt*c(m,i)*qpow(m-i,n);opt=-opt;}cout<<qpow(m,n)-ans;
}

image

洛谷P1450 [HAOI2008] 硬币购物
https://www.luogu.com.cn/problem/P1450

这道题可以将第i种硬币用的数量超了看作一个约束条件,提前处理出来无限背包的情况,同样是用总数减去不合法的总数

这里有一个小技巧,可以用二进制数从1到16遍历,用有几位是1来判断加还是减

image

点击查看代码
#include <iostream>
#define int long long
using namespace std;
const int MAX=1e5+7;
int c[5];
int f[MAX];//滚动数组,付i元的方案数 
int d[5];
signed main(){for(int i=1;i<=4;i++){cin>>c[i];}f[0]=1;//初始化 for(int i=1;i<=4;i++){for(int j=c[i];j<MAX;j++){f[j]+=f[j-c[i]];//无限背包 }}int T;cin>>T;while(T--){for(int i=1;i<=4;i++){cin>>d[i];}int s;cin>>s;int ans=0;//不合法数量 for(int i=1;i<16;i++){//0001-->1111int left=s,opt=-1;for(int j=1;j<=4;j++){if((i&(1<<(j-1)))!=0){//第j项超了 left-=(d[j]+1)*c[j];opt=-opt;}}if(left>=0){ans+=opt*f[left];}}cout<<f[s]-ans<<endl;}
}

image

3. 总结

容斥原理的一般思路就是用总数减去所有不合法的数目

在计数题,不合法的情况可以拆分成若干个小条件,且满足小条件的总数很容易求时可以考虑容斥原理

一般会搭配 快速幂排列组合逆元乘法原理 等结合出题

算是数学与信息的结合,比较抽象,考场上可能很难看出是容斥原理

更多信息请参考
https://oi-wiki.org/math/combinatorics/inclusion-exclusion-principle/

http://www.zskr.cn/news/3233.html

相关文章:

  • 简历优化全攻略:如何写出吸引HR的简历?
  • bashrc的一些配置记录
  • MyEMS与开源浪潮:如何重塑全球能源管理的未来格局
  • doms.ul.querySelectorvs document.querySelector:DOM查询的层级关系
  • Pwn2Own Automotive 2025 决赛日:49个零日漏洞与88万美元奖金揭晓
  • MyEMS在行动:揭秘开源能源管理系统如何重塑工业与楼宇的能效未来
  • 题解:P14015 [ICPC 2024 Nanjing R] 生日礼物
  • HyperWorks许可回收机制
  • flutter开发window打包成exe可执行文件的步骤
  • 基于Linux系统的定制软件安装硬件设备选型指南
  • c++之is_trivially_default_constructible
  • 猫树分治
  • AI导航生成寻路点-FindPathToLocationSynchronously
  • 智聘无界:AI 破解全球化招聘合规、成本与人才匹配难题的实践路径
  • Flink 与Flink可视化平台StreamPark教程(CDC功能)
  • GAS_Aura-Setting Up Auto Running
  • 源码调试-带你了解下车牌识别的深度学习模型-LPRNet
  • charles破解-在线生成激活码
  • 内部排序-直接插入排序冒泡排序快速排序对比
  • C++ auto关键字
  • ARM主板:低功耗高性能的嵌入式计算核心
  • Gin 模板系统深度解析:客服系统实战开发
  • 系统盘爆了,.vscode,.android占内存太多,使用mklink命令符号链接
  • Acrobat Pro DC 2025下载及破解安装教程,附永久免费免激活中文破解版Acrobat Pro DC安装包(稳定版)
  • 2025绩效管理必知
  • Laravel APP_DEBUG=true:存在账户信息泄露风险
  • 在Proxmox中部署Security Onion的安全配置实战
  • 报表到 BI:企业数据从展示到决策的进阶之路
  • Flink 与Flink可视化平台StreamPark教程(DataStreamApi基本使用)
  • 内部排序-直接插入排序