UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举)
UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举)
题意分析
给出n*m的矩形格子,给出k个点,每个格子里面可以放一个点。现在要求格子的最外围一圈的每行每列,至少要放一个点,并且放在角上的点,同时算那个角所在的行和所在的列。不允许剩下点,求总共的方案数量,结果对1000007取模。
数据范围2 ≤ M,N ≤ 20,K ≤ 500。
考虑到要求组合数目,首先就需要预处理500以内的组合数。正向求解可能有些困难,这样考虑:
不管三七二十一,先求解出所有情况的总和,即C(n*m,k),之后计算出不符合情况的,减去即可。
对于上下左右四条边,设第一行不放的集合为A,最后一行不放的集合为B,第一列不放的集合为C,最后一列不放的集合为D。根据排列组合可以知道,不合法的情况总数有2^4-1 = 15种。对于这15种,就可以用容斥原理求解出来,tot = (A+B+C+D) - ( (A∩B) + (A∩C) + (A∩D) + (B∩C) + (B∩D) + (C∩D) ) + ( (A∩B∩C) + (A∩B∩D) + (A∩C∩D) + (B∩C∩D) ) - (A∩B∩C∩D)(这个就是容斥原理). 共15项,计算之后分别减去即可。
接着对问题转化,第一行不放是什么意思呢?就是选择范围少了一行,即C((m-1)*n,k)。
然后对于容斥求出来的公式,如何进行计算呢?
发现,当所求的集合时奇数个的时候,要从总数中减去(黑体加粗的式子是正号,因为算的是不符合的情况,减去时要整体填一个负号),例如A,B,C,D四项均是一个集合,而(A∩B∩C∩D)就是四个集合。对于集合个数是偶数个的时候,就要加上。做到这一点,也十分容易,用二进制枚举即可。
代码总览
#include <cstdio>
#include <algorithm>
#include <cstring>
#define nmax 505
using namespace std;
int C[nmax][nmax];
int T;
const int MOD = 1000007;
void init()
{
memset(C,0,sizeof C);
C[0][0] = 1;
for(int i = 1;i<nmax;++i){
C[i][0] = C[i][i] = 1;
for(int j = 1;j<nmax;++j){
C[i][j] = (C[i-1][j-1] + C[i-1][j]) % MOD;
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
init();
scanf("%d",&T);
for(int kase = 1;kase <= T; kase++){
int n,m,k;
scanf("%d %d %d",&m,&n,&k);
int up = 1,down = 2,left = 4,right = 8;
int ans = 0;
for(int i = 0;i<16;++i){
int column = n,line = m,index = 0;
if(up&i) column--,index++;
if(down&i) column--,index++;
if(left&i) line--,index++;
if(right&i) line--,index++;
if(index&1){
ans = (ans - C[column * line][k]) % MOD;
}else{
ans = (ans + C[column * line][k] + MOD) % MOD;
}
}
printf("Case %d: ",kase);
printf("%d\n",ans);
}
return 0;
}
UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举)的更多相关文章
- UVa 11806 Cheerleaders (容斥原理+二进制表示状态)
In most professional sporting events, cheerleaders play a major role in entertaining the spectators. ...
- HDU.1796 How many integers can you find ( 组合数学 容斥原理 二进制枚举)
HDU.1796 How many integers can you find ( 组合数学 容斥原理 二进制枚举) 题意分析 求在[1,n-1]中,m个整数的倍数共有多少个 与 UVA.10325 ...
- UVA.10325 The Lottery (组合数学 容斥原理 二进制枚举)
UVA.10325 The Lottery (组合数学 容斥原理) 题意分析 首先给出一个数n,然后给出m个数字(m<=15),在[1-n]之间,依次删除给出m个数字的倍数,求最后在[1-n]之 ...
- UVA - 11806 Cheerleaders (容斥原理)
题意:在N*M个方格中放K个点,要求第一行,第一列,最后一行,最后一列必须放,问有多少种方法. 分析: 1.集合A,B,C,D分别代表第一行,第一列,最后一行,最后一列放. 则这四行必须放=随便放C[ ...
- UVA 11806 Cheerleaders (容斥原理
1.题意描述 本题大致意思是讲:给定一个广场,把它分为M行N列的正方形小框.现在给定有K个拉拉队员,每一个拉拉队员需要站在小框内进行表演.但是表演过程中有如下要求: (1)每一个小框只能站立一个拉拉队 ...
- UVa 11806 Cheerleaders (数论容斥原理)
题意:给定一个n*m的棋盘,要放k个石子,要求第一行,最后一行,第一列,最后一列都有石子,问有多少种放法. 析:容斥原理,集合A是第一行没有石子,集合B是最后一行没有石子,集合C是第一列没有石子,集合 ...
- uva 11806 Cheerleaders
// uva 11806 Cheerleaders // // 题目大意: // // 给你n * m的矩形格子,要求放k个相同的石子,使得矩形的第一行 // 第一列,最后一行,最后一列都必须有石子. ...
- UVA 11806 Cheerleaders (组合+容斥原理)
自己写的代码: #include <iostream> #include <stdio.h> #include <string.h> /* 题意:相当于在一个m*n ...
- UVA 11806 Cheerleaders (容斥原理)
题意 一个n*m的区域内,放k个啦啦队员,第一行,最后一行,第一列,最后一列一定要放,一共有多少种方法. 思路 设A1表示第一行放,A2表示最后一行放,A3表示第一列放,A4表示最后一列放,则要求|A ...
随机推荐
- 0.0 配置JAVA环境和Maven环境(W10注意点)
今天上班第一天,真有些忘了之前配置的环境问题,全新的电脑开始配置. 电脑软件JDK以及eclipse都是下载最新的 添加最全的链接吧: 1.JDK配置链接:http://www.cnblogs.com ...
- Vuejs 使用 lib 库模式打包 umd 解决 NPM 包发布的问题
由于升级了 v0.2 版 GearCase 使用打包工具从 parcel 更换成 vue-cli 3.x.因此打包后发布 NPM 包的方式与之前有很大的差异,这也导致了在发布完 GearCase v0 ...
- Linux系列——安装双系统Ubuntu
作为一个穷人,电脑破得不行却没钱换,怎么办呢,不如换个Ubuntu吧,没有Windows那么多后台应用,在我这台古董上稍微流畅一点. Linux有很多发行版,比较流行和适合入门的就是Ubuntu和De ...
- MATLAB2018a与2016b分类学习模型Java库向上兼容操作
matlab2016版本无法兼容matlab2018版本Classification Learner创建的分类器 在java环境下,使用matlab2016版本调用matlab2018版本Classi ...
- IPC_Binder_java_2
title: IPC_Binder_java_2 date: 2017-07-04 14:47:55 tags: [IPC,Binder] categories: [Mobile,Android] - ...
- Linux(Contos7.5)环境搭建之JDK1.8安装(二)
1.下载安装包 wget -p 目录 url包地址 2.解压安装包 tar -xzvf 文件 -C 指定目录 3.修改名称 mv jdk1.8.0_45 jdk1.8 4.配置环境变量 vim /e ...
- Array.Copy 数据是克隆吗?
偶然看到 Array.Copy 方法的时候,想到,它是否是克隆,又是否是深克隆. 做了一个测试 public class abc { public string hello; } [TestMetho ...
- 【转】Java生成plist下载ipa文件
我们在上传ipa想要安装的时候必须要通过plist文件去下载,并且还要遵循 itms-services协议. 意思就是,第一步我们要生成一个plist文件, 第二步生成一个html文件,用来指向pli ...
- JS进阶系列之原型、原型链
最近在看 JavaScript忍者秘籍 这本书的时候,再加上最近遇到的关于原型.原型链的面试题,所以萌生了要把这些知识梳理一遍的想法,所以以下是我自己对原型.原型链的看法 什么是原型 提到原型,我们可 ...
- 跟踪调试Linux内核的启动过程
跟踪调试Linux内核的启动过程---使用gdb 符钰婧 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...