自己写的代码:

#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 (组合+容斥原理)的更多相关文章

  1. UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举)

    UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举) 题意分析 给出n*m的矩形格子,给出k个点,每个格子里面可以放一个点.现在要求格子的最外围一圈的每行每列,至少要放一个 ...

  2. UVa 11806 - Cheerleaders (组合计数+容斥原理)

    <训练指南>p.108 #include <cstdio> #include <cstring> #include <cstdlib> using na ...

  3. UVa 11806 Cheerleaders (容斥原理+二进制表示状态)

    In most professional sporting events, cheerleaders play a major role in entertaining the spectators. ...

  4. UVA 11806 Cheerleaders (容斥原理

    1.题意描述 本题大致意思是讲:给定一个广场,把它分为M行N列的正方形小框.现在给定有K个拉拉队员,每一个拉拉队员需要站在小框内进行表演.但是表演过程中有如下要求: (1)每一个小框只能站立一个拉拉队 ...

  5. UVa 11806 Cheerleaders (数论容斥原理)

    题意:给定一个n*m的棋盘,要放k个石子,要求第一行,最后一行,第一列,最后一列都有石子,问有多少种放法. 析:容斥原理,集合A是第一行没有石子,集合B是最后一行没有石子,集合C是第一列没有石子,集合 ...

  6. UVA - 11806 Cheerleaders (容斥原理)

    题意:在N*M个方格中放K个点,要求第一行,第一列,最后一行,最后一列必须放,问有多少种方法. 分析: 1.集合A,B,C,D分别代表第一行,第一列,最后一行,最后一列放. 则这四行必须放=随便放C[ ...

  7. uva 11806 Cheerleaders

    // uva 11806 Cheerleaders // // 题目大意: // // 给你n * m的矩形格子,要求放k个相同的石子,使得矩形的第一行 // 第一列,最后一行,最后一列都必须有石子. ...

  8. UVA 11806 Cheerleaders (容斥原理)

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

  9. 【递推】【组合数】【容斥原理】UVA - 11806 - Cheerleaders

    http://www.cnblogs.com/khbcsu/p/4245943.html 本题如果直接枚举的话难度很大并且会无从下手.那么我们是否可以采取逆向思考的方法来解决问题呢?我们可以用总的情况 ...

随机推荐

  1. setbuf

    setbuf是linux中的C函数,主要用于打开和关闭缓冲机制. setbuf函数具有打开和关闭缓冲机制.为了带缓冲进行I/O,参数buf必须指向一个长度为BUFSIZ(定义在stdio.h头文件中) ...

  2. Codevs 1669 运输装备

    时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 德国放松对英国的进攻后,把矛头指向了东北—— ...

  3. yaf运行错误:Class 'Yaf_Application' not found

    提示:致命错误 Yaf_Application 基类没有加载进去 一检查:phpinfo() 里yaf 扩展有没有安装上 扩展也安装进去了 这时在分布式配置文件的重写 也是正确 这时百思不得其解,没办 ...

  4. tp中让头疼似懂非懂的create

    项目中多次用到create() 只能它是表单验证,不过好出错,痛下心扉好好了解理解它的来龙去脉和所用的用法 一:通过create() 方法或者 赋值的方法生成数据对象,然后写入数据库 $model = ...

  5. CSS1-CSS3 <color>颜色知识知多少?

    非本人原创,原文转载自http://www.zhangxinxu.com/wordpress/2015/07/know-css1-css3-color/ by zhangxinxu from http ...

  6. TOMCAT内存大小调整

    Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机.JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序.这个初始内存和最大内存在一定程度都会 ...

  7. (转)可收缩、扩展的TextView

    在一些应用中,比如腾讯的应用市场APP应用宝,关于某款应用的介绍文字,如果介绍文字过长,那么不是全部展现出来,而是显示三四行的开始部分(摘要),预知全部的内容,用户点击展开按钮即可查阅全部内容.这样的 ...

  8. Firebird数据库相关备忘录

    Firebird数据库中有一些很特别的东西,很好用,但由于平时用的不多,记在这里,以备以后用到时查询. 1.以ADO 的OLE ODBC驱动方式访问 Firebird,可以使用如下连接串: FBCon ...

  9. intellij idea 代码正常,但是编译出现 java:需要";"

    1. 查看idea 的maven 插件是不是版本太低,发现应用里是用的jdk是1.7 maven插件是2.2.1 2. 查看应用编码,比如部分文件是GBK,里面有中文,而整个应用的编码是Utf-8

  10. ActiveMQ之deliveryMode

    在下面的例子中,分别发送一个Persistent和nonpersistent的消息,然后关闭退出JMS. import javax.jms.Connection;import javax.jms.De ...