UVA 11806 Cheerleaders (组合+容斥原理)
自己写的代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
/*
题意:相当于在一个m*n的矩形网格里放k个相同的石子,问有多少种方法?
限制条件:每个格子最多放一个石子,所有石子都要用完,并且第一行、最后一行、第一列、最后一列都得有石子。
思路:
直接求的话会比较麻烦,反过来想:
设总方案数为S,A={第一行没有石子},B={最后一行没有石子},C={第一列没有石子},D={最后一列没有石子}
利用容斥原理,先求|A并B并C并D|,然后再用|s|-|A并B并C并D|,即为答案。
而对于有r行,t列,摆放k个石子的方案数为C(r*t,k)。
*/
using namespace std;
const int maxn=;
const int mod=;
long long c[maxn*maxn][maxn*maxn];
int t,m,n,k;
void init(){
memset(c,,sizeof(c)); //先初始化为0,因为在计算容斥原理的时候,很有可能会出现C(i,j)(j>i)的情形,此时应该值为0
c[][]=;
for(int i=;i<maxn*maxn;i++){ //求出组合数
c[i][]=;
for(int j=;j<i;j++)
c[i][j]=(c[i-][j-]+c[i-][j])%mod;
c[i][i]=;
}
}
int main()
{
long long ans,tmp;
init();
scanf("%d",&t);
for(int i=;i<=t;i++){
ans=;
scanf("%d%d%d",&m,&n,&k);
if(k>m*n||k<)
ans=;
else{
//先求|A并B并C并D|,由于只有四个元素,所以直接写出式子了
ans=(*c[(m-)*n][k]+*c[m*(n-)][k])%mod;
tmp=((c[(m-)*n][k]+*c[(m-)*(n-)][k]%mod)%mod+c[(n-)*m][k])%mod;
ans=(ans-tmp+mod)%mod;
ans=(ans+*c[(m-)*(n-)][k])%mod;
ans=(ans+*c[(m-)*(n-)][k])%mod;
ans=(ans+mod-c[(m-)*(n-)][k])%mod; ans=(c[m*n][k]-ans+mod)%mod; //最后再用所有总的方案数减去ans值,即为最后要求的答案
}
printf("Case %d: %lld\n",i,ans);
}
return ;
}
白书上的代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
/*
题意:相当于在一个m*n的矩形网格里放k个相同的石子,问有多少种方法?
限制条件:每个格子最多放一个石子,所有石子都要用完,并且第一行、最后一行、第一列、最后一列都得有石子。
思路:
直接求的话会比较麻烦,反过来想:
设总方案数为S,A={第一行没有石子},B={最后一行没有石子},C={第一列没有石子},D={最后一列没有石子}
利用容斥原理,先求|A并B并C并D|,然后再用|s|-|A并B并C并D|,即为答案。
而对于有r行,t列,摆放k个石子的方案数为C(r*t,k)。
*/
using namespace std;
const int maxn=;
const int mod=;
int C[maxn*maxn][maxn*maxn];
int t,m,n,k;
void init(){
memset(C,,sizeof(C)); //先初始化为0,因为在计算容斥原理的时候,很有可能会出现C(i,j)(j>i)的情形,此时应该值为0
C[][]=;
for(int i=;i<maxn*maxn;i++){ //求出组合数
C[i][]=;
for(int j=;j<i;j++)
C[i][j]=(C[i-][j-]+C[i-][j])%mod;
C[i][i]=;
}
} int main()
{
init();
scanf("%d",&t);
for(int i=;i<=t;i++){
int sum=;
scanf("%d%d%d",&m,&n,&k);
//枚举所有16种搭配方式,s=0表明是总的方案数
//由于最后我们求的是补给的个数,所以在用容斥原理的时候稍作修改:
//原本奇数个集合是加,改为减;偶数个集合是减,改为加
for(int s=;s<;s++){
int b=,r=n,c=m; //b统计该方案数对应的集合的个数,r和c是可以放置的行列数
if(s&){
b++;
r--;
}
if(s&(<<)){
b++;
r--;
}
if(s&(<<)){
b++;
c--;
}
if(s&(<<)){
b++;
c--;
}
if(b&)
sum=(sum+mod-C[r*c][k])%mod; //奇数个集合,做减法
else
sum=(sum+C[r*c][k])%mod; //偶数个集合,做加法
}
printf("Case %d: %d\n",i,sum);
}
return ;
}
UVA 11806 Cheerleaders (组合+容斥原理)的更多相关文章
- UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举)
UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举) 题意分析 给出n*m的矩形格子,给出k个点,每个格子里面可以放一个点.现在要求格子的最外围一圈的每行每列,至少要放一个 ...
- UVa 11806 - Cheerleaders (组合计数+容斥原理)
<训练指南>p.108 #include <cstdio> #include <cstring> #include <cstdlib> using na ...
- UVa 11806 Cheerleaders (容斥原理+二进制表示状态)
In most professional sporting events, cheerleaders play a major role in entertaining the spectators. ...
- UVA 11806 Cheerleaders (容斥原理
1.题意描述 本题大致意思是讲:给定一个广场,把它分为M行N列的正方形小框.现在给定有K个拉拉队员,每一个拉拉队员需要站在小框内进行表演.但是表演过程中有如下要求: (1)每一个小框只能站立一个拉拉队 ...
- UVa 11806 Cheerleaders (数论容斥原理)
题意:给定一个n*m的棋盘,要放k个石子,要求第一行,最后一行,第一列,最后一列都有石子,问有多少种放法. 析:容斥原理,集合A是第一行没有石子,集合B是最后一行没有石子,集合C是第一列没有石子,集合 ...
- UVA - 11806 Cheerleaders (容斥原理)
题意:在N*M个方格中放K个点,要求第一行,第一列,最后一行,最后一列必须放,问有多少种方法. 分析: 1.集合A,B,C,D分别代表第一行,第一列,最后一行,最后一列放. 则这四行必须放=随便放C[ ...
- uva 11806 Cheerleaders
// uva 11806 Cheerleaders // // 题目大意: // // 给你n * m的矩形格子,要求放k个相同的石子,使得矩形的第一行 // 第一列,最后一行,最后一列都必须有石子. ...
- UVA 11806 Cheerleaders (容斥原理)
题意 一个n*m的区域内,放k个啦啦队员,第一行,最后一行,第一列,最后一列一定要放,一共有多少种方法. 思路 设A1表示第一行放,A2表示最后一行放,A3表示第一列放,A4表示最后一列放,则要求|A ...
- 【递推】【组合数】【容斥原理】UVA - 11806 - Cheerleaders
http://www.cnblogs.com/khbcsu/p/4245943.html 本题如果直接枚举的话难度很大并且会无从下手.那么我们是否可以采取逆向思考的方法来解决问题呢?我们可以用总的情况 ...
随机推荐
- 济南学习 Day 3 T1 am
NP(np)Time Limit:1000ms Memory Limit:64MB题目描述LYK 喜欢研究一些比较困难的问题,比如 np 问题.这次它又遇到一个棘手的 np 问题.问题是这个样子的:有 ...
- iPhone Tableview分批显示数据
//非原创 iPhone Tableview分批显示数据是本文要介绍的内容,主要讲解的是数据的显示.iPhone屏幕尺寸是有限的,如果需要显示的数据很多,可以先数据放到一个table中,先显示10 ...
- 四位数码管SH5461AS的问题,arduino学习实测.
arduino入门教程到第16课遇到些问题.效果一直是混乱的状态. 琢磨了半天发现一些问题,和大家分享下 1)接线图,原图没有问题,只是比较含糊,线比较多不好看. 我用红色数字标示数码管的12个脚,并 ...
- 1.servlet hello实例---HelloServlet
1.用url调用servlet 建 web project “HelloServlet”,在src下建包com.amaker.servlet,在包下建HelloServlet.java. packag ...
- netstat监控大量ESTABLISHED连接与Time_Wait连接问题(转载)
问题描述: 在不考虑系统负载.CPU.内存等情况下,netstat监控大量ESTABLISHED连接与Time_Wait连接. # netstat -n | awk '/^tcp/ {++y[$NF] ...
- asp.net2.0 国际化
公司业务需要在国外开展了, 因此以前的系统要做多国语言了, 从网上搜集了好多资料, 最后选择了一个比较简单的方案 1. 打开vs2005, 新建网站, 首先在配置文件中添加配置: <syste ...
- Oracle10G的Sga_max_size和sga_target应该如何设置啊!
1调整原因 我们的客户反应现在我们公司的软件使用起来比较漫.目前他们已经用快要两年了.根据用户反应的情况,公司派我到现场做数据库调优.我在现场走访了几个部门,也向操作人员了解了一些情况.我初步分析认定 ...
- Silverlight C#动态设置样式
1.从页面资源中获取样式并应用 btnTest.Style = (Style)this.Resources["BigButtonStyle"] 2.从项目中单独分开的资源字典文件( ...
- protobuf编译报错
在下载protobuf进行编译的时候会出现如图所示的错误 修改 C:\protobuf-2.4.1\gtest\include\gtest\internal\gtest-tuple.h(C:是我解压p ...
- php学习日志(4)-The mbstring extension is missing. Please check your PHP configuration错误及解决方法
在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring extension is missing. Please che ...