当前位置: 首页 > 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.wxhsa.cn/company.asp?id=2179

相关文章:

  • 【B】世良真纯
  • 如何使用jobleap.cn避免简历中的严重错误
  • 在 Zustand 中创建通用 Action 的优雅实践
  • 如何用产品思维优化简历的“用户体验”?
  • 简历如何优化,简历如何投递,面试如何准备?
  • 网络流做题笔记
  • 简历优化全攻略:如何写出吸引HR的简历?
  • 重塑云上 AI 应用“运行时”,函数计算进化之路
  • 25.9.12 C语言基本数据类型
  • Avalonia:基础导航
  • bashrc的一些配置记录
  • H5游戏性能优化系列-----协议相关优化
  • 实现我的第一个langchain应用
  • 小说可视化系统设计(程序员副业项目)
  • MyEMS与开源浪潮:如何重塑全球能源管理的未来格局
  • React Antd or Antd Pro:findDOMNode is deprecated and will be removed in the next major release.
  • 单板挑战4路YOLOv8!米尔瑞芯微RK3576开发板性能实测
  • doms.ul.querySelectorvs document.querySelector:DOM查询的层级关系
  • 穿越钱塘江:一条高铁隧道背后的技术挑战
  • Pwn2Own Automotive 2025 决赛日:49个零日漏洞与88万美元奖金揭晓
  • 9.HPA与VPA
  • MyEMS在行动:揭秘开源能源管理系统如何重塑工业与楼宇的能效未来
  • 题解:P14015 [ICPC 2024 Nanjing R] 生日礼物
  • 吻得太逼真
  • HyperWorks许可回收机制
  • flink on k8s的基本介绍
  • 高性能计算基础
  • flutter开发window打包成exe可执行文件的步骤
  • Transtion动画组件要求包裹元素必须是单一根节点
  • linux启动ntp服务