UVA - 11806 Cheerleaders(组合数学+容斥原理)
题目链接:点击查看
题目大意:给出一个n*m的矩阵,现在有k个拉拉队员,要求在第一列、最后一列、第一行和最后一行至少有一个拉拉队员,注意以下要求:
- 四个角上的拉拉队员可以同时属于两条边
- 每个方格至多只能存在一个拉拉队员
问能有多少种分配方案
题目分析:这个题目很明显的要用到组合数学了,我们假设C(n,m)代表的是从n个物品中选出m个的方案数,如果没有约束条件,那么答案显然是C(n*m,k)了,现在有了约束条件,正难则反,我们可以利用容斥原理计算出不在指定位置的方案数,最后用总的方案数减去就好了,我们现在设
- A=不在第一列的方案数
- B=不在最后一列的方案数
- C=不在第一行的方案数
- D=不在最后一行的方案数
那么不在指定位置的方案数就是:
A+B+C+D-AB-AC-AD-BC-BD+ABC+ABD+BCD+ACD-ABCD
这样我们枚举子集利用容斥原理计算就好了,为了方便枚举,我们设一个四位数的二进制的每一位为1,2,4,8,简单的写写if else就好了
注意一下这个题目的一个小坑,就是给出的1e6+7并不是一个素数,所以不能用费马小定理求逆元,相应的也就不能预处理出阶乘的逆元了,所以求组合数可以用杨辉三角形的递推式来写
代码:
#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=550;const int mod=1000007;int C[N][N];void init()
{for(int i=1;i<N;i++)for(int j=1;j<=i;j++){if(j==1)C[i][j]=i;elseC[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;}
}int main()
{
// freopen("input.txt","r",stdin);
// ios::sync_with_stdio(false);init();int w;cin>>w;int kase=0;while(w--){int n,m,k;scanf("%d%d%d",&n,&m,&k);LL ans=C[n*m][k];for(int i=1;i<16;i++){int nn=n,mm=m,cnt=0;if(i&1)nn--,cnt++;if(i&2)nn--,cnt++;if(i&4)mm--,cnt++;if(i&8)mm--,cnt++;if(cnt&1)ans-=C[nn*mm][k];elseans+=C[nn*mm][k];ans=(ans%mod+mod)%mod;}printf("Case %d: %lld\n",++kase,ans);}return 0;
}
UVA - 11806 Cheerleaders(组合数学+容斥原理)相关推荐
- UVA 11806 Cheerleaders (容斥原理)
题意 一个n*m的区域内,放k个啦啦队员,第一行,最后一行,第一列,最后一列一定要放,一共有多少种方法. 思路 设A1表示第一行放,A2表示最后一行放,A3表示第一列放,A4表示最后一列放,则要求|A ...
- UVa 11806 Cheerleaders
题意:m行n列的矩形网格放k个相同的石子,要求第一行最后一行第一列最后一列都必须有石子,问有多少种放法 A为第一行没有石子的方案数,BCD依此类推,全集为S 如果没有任何要求的话,放法数应该是C(rc ...
- 组合数学—容斥原理与鸽巢原理
目录 一 写在开头 二 容斥原理 三 鸽巢原理 四 Ramsey定理 五 Burnside引理与波利亚定理 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 写在开头 本文内容为<组合数 ...
- bzoj 4710 [Jsoi2011]分特产 组合数学+容斥原理
题面 题目传送门 解法 考虑容斥原理 显然,我们可以枚举有多少个人没有收到 然后就转化成一个组合问题了 假设现在有\(x\)个物品,\(n\)个人,可以有人没有被分到,那么分给这\(n\)个人的方案数 ...
- 组合数学-容斥原理-求指定区间内与n互素的数的个数
求指定区间内与n互素的数的个数 给出整数n和r.求区间[1,r]中与n互素的数的个数. 去解决它的逆问题,求不与n互素的数的个数. 考虑n的所有素因子pi(i=1···k) 在[1,r]中有多少数能被 ...
- 【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)
3294: [Cqoi2011]放棋子 Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数 ...
- 组合数学 | 容斥原理与鸽巢原理
目录 容斥原理 鸽巢原理 容斥原理 德摩根定理:设A,B为全集U的任意两个子集,则 德摩根定理推广:设A1,A2-An为U的子集,则 容斥原理: 两个集合的容斥原理 设A和B是分别具有性质P1和P2的 ...
- UVA 11645 Bits(组合数学)
从左往右处理,左半部分记为left, 右半部分记为right,若i,i -1均为1, 贡献为ans += (left + 1) + right * (1ll << (i - 1)); 否则 ...
- BZOJ4487 JSOI2015染色问题(组合数学+容斥原理)
逐个去除限制.第四个限制显然可以容斥,即染恰好c种颜色的方案数=染至多c种颜色的方案数-染至多c-1种颜色的方案数+染至多c-2种颜色的方案数-- 然后是限制二.同样可以容斥,即恰好选n行的方案数=至 ...
最新文章
- mipi屏在内核可以显示logo但是u-boot无法显示的问题【转】
- MATLAB中floor、round、ceil、fix区别
- 剑指offer之partition算法
- python槽怎么用_【Python成长之路】从零学GUI -- 多窗口跳转(信号与槽函数用法)...
- android 用户中心布局,android用户中心头像选择功能的方法实现-Go语言中文社区
- Android--SharedPreferences数据存储方案
- android 通讯录恢复,通讯录恢复
- 达梦数据库图形化工具
- CAD2007输出高清图片
- java调用讯飞语音合成api
- centos7创建asm磁盘_centos7下安装oracle rac使用udev绑定磁盘方法
- 求解逆矩阵的常用三种方法
- 图像互信息(MI)的计算(Python版本)
- Git用户手册--GitHub
- 一元二次方程ax2+bx+c=0的解
- 美国大学计算机牛校简介
- Sql server AlwaysOn搭建常见问题
- CentOS6云服务器磁盘扩容方案
- 植物蛋白食品的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- c# WGS84坐标转换成UTM坐标