容斥原理——Uva11806-Cheerleaders
来源:互联网 发布:那个软件看电影免费 编辑:程序博客网 时间:2024/05/17 06:02
vjudge链接:Uva11806-Cheerleaders
题目大意:给一个
求这种情况讨论的话十分麻烦,但是可以考虑间接的求取,比如:求第一行,最后一行,第一列,最后一列都没有石子的情况就很简单,就是组合数
而由此可以想到如果设事件A,B,C,D。分别为第一行,最后一行,第一列,最后一列没石子的话。
容斥原理的集合加减的规律是奇数个集合的析取式是加上。偶数个集合的析取式是减去。
所以问题就变得简单了。就是求上式的集合内的元素数。这笔直接求取答案绝对要简单的多。因为这些集合都是简单的集合。
其次这道题记得要取模。减法取模为了避免结果是负数要先加上
#include <iostream> #include <cstdio> #include <cstring> const int mod = 1000007; const int maxk = 500; using namespace std; int C[maxk+10][maxk+10]; void fun() { memset(C,0,sizeof(C)); C[0][0] = 1; for(int i=0;i<=maxk;i++) { C[i][0] = C[i][i] = 1; for(int j=1;j<i;j++) { C[i][j] = (C[i-1][j]+C[i-1][j-1])%mod; } } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); fun(); int T,cas=1; scanf("%d",&T); int n,m,k; while(T--) { int ans = 0; scanf("%d%d%d",&m,&n,&k); int C_D = 2*C[(n-1)*m][k]; ans=(ans+C_D)%mod; int A_B = 2*C[(m-1)*n][k] ; ans=(ans+A_B)%mod; int CD = C[(n-2)*m][k]; ans=(ans+mod-CD)%mod; int AB = C[(m-2)*n][k]; ans=(ans+mod-AB)%mod; int AC = 4*C[(n-1)*(m-1)][k]; ans=(ans+mod-AC)%mod; int ABC_ABD = 2*C[(m-2)*(n-1)][k]; ans=(ans+ABC_ABD)%mod; int ACD_BCD = 2*C[(n-2)*(m-1)][k]; ans=(ans+ACD_BCD)%mod; int ABCD = C[(m-2)*(n-2)][k]; ans=(ans+mod-ABCD)%mod; ans = (C[n*m][k]+mod-ans)%mod; printf("Case %d: %d\n",cas++,ans); } return 0; }
对于求解集合的方法这里用到的是笨方法。刘汝佳白书上有使用二进制来处理ABCD的搭配问题。这也是搭配问题的优秀思路。(我不够优秀)
#include <iostream> #include <cstdio> #include <cstring> const int mod = 1000007; const int maxk = 500; using namespace std; int C[maxk+10][maxk+10]; void fun() { memset(C,0,sizeof(C)); C[0][0] = 1; for(int i=0;i<=maxk;i++) { C[i][0] = C[i][i] = 1; for(int j=1;j<i;j++) { C[i][j] = (C[i-1][j]+C[i-1][j-1])%mod; } } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); fun(); int T,cas=1; scanf("%d",&T); int n,m,k; while(T--) { scanf("%d%d%d",&m,&n,&k); int sum =0; for(int S=0;S<16;S++) { int b=0,r=n,c=m; if(S&1) {r--;b++;} if(S&2) {r--;b++;} if(S&4) {c--;b++;} if(S&8) {c--;b++;} if(b&1) sum=(sum+mod-C[r*c][k])%mod; else sum = (sum + C[r*c][k])%mod; } printf("Case %d: %d\n",cas++,sum); } return 0; }
阅读全文
0 0
- 容斥原理——Uva11806-Cheerleaders
- uva11806 - Cheerleaders 容斥原理
- UVa11806 Cheerleaders(容斥原理)
- 【UVA11806】Cheerleaders——容斥
- UVA11806-Cheerleaders(容斥原理+二进制)
- UVA11806-Cheerleaders(容斥原理+二进制)
- 20160331 UVA11806 Cheerleaders(组合数公式+容斥原理)
- Uva11806——容斥原理
- UVA11806 容斥原理
- uva11806(容斥原理)拉拉队
- Cheerleaders UVA11806
- uva11806 Cheerleaders
- uva11806 - Cheerleaders
- uva11806 Cheerleaders
- 【Uva11806】Cheerleaders
- UVA 11806(B)——Cheerleaders 容斥原理 离散数学列举所有情况
- UVA 11806 - Cheerleaders (容斥原理)
- UVa 11806 Cheerleaders / 容斥原理
- struts2的核心和工作原理
- #make及makefile
- JVM性能调优之生成堆的dump文件
- 面试前准备
- pycharm社区版和专业版的区别
- 容斥原理——Uva11806-Cheerleaders
- 使用JMAP dump及分析dump文件
- #git笔记
- 我的算法之路2_分析算法
- 2017.12.10
- java IO
- 基于CC3200的MQTT客户端网关设计
- 6.1、初始化多节点群集(单个数据中心)
- Git 的 .gitignore 配置规则