题目链接:点击查看

题目大意:给出一个n*m的矩阵,现在有k个拉拉队员,要求在第一列、最后一列、第一行和最后一行至少有一个拉拉队员,注意以下要求:

  1. 四个角上的拉拉队员可以同时属于两条边
  2. 每个方格至多只能存在一个拉拉队员

问能有多少种分配方案

题目分析:这个题目很明显的要用到组合数学了,我们假设C(n,m)代表的是从n个物品中选出m个的方案数,如果没有约束条件,那么答案显然是C(n*m,k)了,现在有了约束条件,正难则反,我们可以利用容斥原理计算出不在指定位置的方案数,最后用总的方案数减去就好了,我们现在设

  1. A=不在第一列的方案数
  2. B=不在最后一列的方案数
  3. C=不在第一行的方案数
  4. 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(组合数学+容斥原理)相关推荐

  1. UVA 11806 Cheerleaders (容斥原理)

    题意 一个n*m的区域内,放k个啦啦队员,第一行,最后一行,第一列,最后一列一定要放,一共有多少种方法. 思路 设A1表示第一行放,A2表示最后一行放,A3表示第一列放,A4表示最后一列放,则要求|A ...

  2. UVa 11806 Cheerleaders

    题意:m行n列的矩形网格放k个相同的石子,要求第一行最后一行第一列最后一列都必须有石子,问有多少种放法 A为第一行没有石子的方案数,BCD依此类推,全集为S 如果没有任何要求的话,放法数应该是C(rc ...

  3. 组合数学—容斥原理与鸽巢原理

    目录 一 写在开头 二 容斥原理 三 鸽巢原理 四 Ramsey定理 五 Burnside引理与波利亚定理 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 写在开头 本文内容为<组合数 ...

  4. bzoj 4710 [Jsoi2011]分特产 组合数学+容斥原理

    题面 题目传送门 解法 考虑容斥原理 显然,我们可以枚举有多少个人没有收到 然后就转化成一个组合问题了 假设现在有\(x\)个物品,\(n\)个人,可以有人没有被分到,那么分给这\(n\)个人的方案数 ...

  5. 组合数学-容斥原理-求指定区间内与n互素的数的个数

    求指定区间内与n互素的数的个数 给出整数n和r.求区间[1,r]中与n互素的数的个数. 去解决它的逆问题,求不与n互素的数的个数. 考虑n的所有素因子pi(i=1···k) 在[1,r]中有多少数能被 ...

  6. 【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)

    3294: [Cqoi2011]放棋子 Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数 ...

  7. 组合数学 | 容斥原理与鸽巢原理

    目录 容斥原理 鸽巢原理 容斥原理 德摩根定理:设A,B为全集U的任意两个子集,则 德摩根定理推广:设A1,A2-An为U的子集,则 容斥原理: 两个集合的容斥原理 设A和B是分别具有性质P1和P2的 ...

  8. UVA 11645 Bits(组合数学)

    从左往右处理,左半部分记为left, 右半部分记为right,若i,i -1均为1, 贡献为ans += (left + 1) + right * (1ll << (i - 1)); 否则 ...

  9. BZOJ4487 JSOI2015染色问题(组合数学+容斥原理)

    逐个去除限制.第四个限制显然可以容斥,即染恰好c种颜色的方案数=染至多c种颜色的方案数-染至多c-1种颜色的方案数+染至多c-2种颜色的方案数-- 然后是限制二.同样可以容斥,即恰好选n行的方案数=至 ...

最新文章

  1. mipi屏在内核可以显示logo但是u-boot无法显示的问题【转】
  2. MATLAB中floor、round、ceil、fix区别
  3. 剑指offer之partition算法
  4. python槽怎么用_【Python成长之路】从零学GUI -- 多窗口跳转(信号与槽函数用法)...
  5. android 用户中心布局,android用户中心头像选择功能的方法实现-Go语言中文社区
  6. Android--SharedPreferences数据存储方案
  7. android 通讯录恢复,通讯录恢复
  8. 达梦数据库图形化工具
  9. CAD2007输出高清图片
  10. java调用讯飞语音合成api
  11. centos7创建asm磁盘_centos7下安装oracle rac使用udev绑定磁盘方法
  12. 求解逆矩阵的常用三种方法
  13. 图像互信息(MI)的计算(Python版本)
  14. Git用户手册--GitHub
  15. 一元二次方程ax2+bx+c=0的解
  16. 美国大学计算机牛校简介
  17. Sql server AlwaysOn搭建常见问题
  18. CentOS6云服务器磁盘扩容方案
  19. 植物蛋白食品的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  20. c# WGS84坐标转换成UTM坐标

热门文章

  1. MySQ软件的卸载-通过控制面板方式
  2. CompletableFuture介绍
  3. Buffer的基本的原理
  4. ClassLoader的常用方法及获取方法
  5. hadoop的安装-配置文件修改
  6. redis常见应用场景
  7. Ribbon-2通过代码自定义配置ribbon
  8. Spring Aware接口
  9. LinkedBlockingQueue源码
  10. html 列表循环_python web开发:内置标签与过滤器/循环/条件判断