莫名打不开这道题的链接,请读者自行搜索

Description

有一个N*M的棋盘,初始每个格子都是白色的。
行操作是指选定某一行,将这行所有格子的颜色取反(黑白互换)。
列操作是指选定某一列,将这列所有格子的颜色取反。
XX进行了R次行操作C次列操作(可能对某行或者某列操作了多次),最后棋盘上有S个黑色格子。
问有多少种不同的操作方案。两种操作方案不同,当且仅当对某行或者某列操作次数不同(也就是说与操作的顺序无关)。
方案数可能很大,输出它对10^9+7取模的结果。
 

Input

输入只有5个整数N,M,R,C,S。

Output

输出有且仅有一个整数,表示答案对10^9+7取模的结果。
 

Sample Input

2 2 2 2 4

Sample Output

4
 

Data Constraint

对于20%的数据,满足N,M,R,C≤4。
对于60%的数据,满足N,M,R,C≤1500。
对于100%的数据,满足N,M,R,C≤100000,0≤S≤N*M。
 
 
其实题目里面已经给了提示了,对于行和列操作,顺序什么的是无所谓的,也就是说我们只需要考虑最终有几行被翻转了奇数次,几列被翻转了奇数次就可以统计答案了。
我们设有i行被翻转了奇数次,j列被翻转了奇数次,且最终有s个黑格,可以得到:
i*m+c*n-2*i*j=s(很好理解,有点类似于容斥,可自行模拟几组看看)
于是我们可以依次枚举i的值,就能对应的算出j的值。(当然i,j是有范围的,细节见程序)
现在问题变成我们知道i,j怎么统计方案数
重新说明i的含义:对于n行,我们进行r次操作,有i行被操作了奇数次。
 
 
分成两种情况(p=i,q=j)
1. 2*p=n,我们发现此时j的计算式的分母为0,这意味着此时j在范围内随意取值。注意此时s必须等于n*m/2(也请读者模拟几组数组,这是显而易见的)
方案数calc1=C(n,p)*C((r-p)/2+n-1,n-1)*C(c+m-1,m-1)

2. 2*p<>n

方案数calc2=C(n,p)*C(m,q)*C((r-p)/2+n-1,n-1)*C((c-q)/2+m-1,m-1)

想必不能理解的形如C((r-p)/2+n-1,n-1)这样的式子吧。下面解释它的含义:我们有r次操作,最后有p点贡献的,可以假设我们有r个球,每次我们可以把两个球同时消去(称为合并操作),最后我们还剩下p个球,这是因为对于一行进行两次操作就相当于没有操作。那么(r-p)/2就是我们合并操作的个数。在之后我们就可以任意把这(r-p)/2个操作分配给n行了,方案数就是C((r-p)/2+n-1,n-1)(每一次合并操作其实就是两次翻转)

对于这个分配的方案数不理解的,可以想象把n个一样的球分到m个不同的箱子里的方案数,可参考下面博客https://blog.csdn.net/qwb492859377/article/details/50654627

C的话预处理出阶乘的逆元就好

#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std; const int mod=1e9+;
const int maxn=2e5+;
int n,m,r,c,MAX;
ll s;
int jie[maxn],inv[maxn];
int power(int x,int y)
{
int ans=;
for (;y;y>>=,x=1ll*x*x%mod)
if (y&) ans=1ll*ans*x%mod;
return ans;
}
int C(int m,int n)
{
if (m<||n<||n>m) return ;
return 1ll*jie[m]*inv[n]%mod*inv[m-n]%mod;
}
void prepare()
{
jie[]=inv[]=;
for (int i=;i<=MAX*;i++) jie[i]=1ll*jie[i-]*i%mod;
for (int i=;i<=MAX*;i++) inv[i]=1ll*inv[i-]*power(i,mod-)%mod;
}
int main()
{
scanf("%d%d%d%d%d",&n,&m,&r,&c,&s);
MAX=max(max(n,m),max(r,c));
prepare();
int ans=;
for (int i=;i<=min(n,r);i++)//行的贡献
{ if (i*==n) {
if ((r-i)&||s!=1ll*n*m/) continue;
ans=(ans+1ll*C(n,i)*C((r-i)/+n-,n-)%mod*C(c+m-,m-)%mod)%mod;
}
else
{
if ((s-1ll*i*m)%(n-*i)!=) continue;
int j=(s-1ll*i*m)/(n-*i);//列的贡献
if ((r-i)&||(c-j)&||j<||j>c) continue;
ans=(ans+1ll*C(n,i)*C(m,j)%mod*C((r-i)/+n-,n-)%mod*C((c-j)/+m-,m-)%mod)%mod;
}
}
printf("%d\n",ans);
return ;
}

[NOI2013模拟] BZOJ4705 棋盘游戏 解题报告(组合计数)的更多相关文章

  1. 冲刺Noip2017模拟赛2 解题报告——五十岚芒果酱

    题1 牛跑步(running) [题目描述] 新牛到部队,CG 要求它们每天早上搞晨跑,从 A 农场跑到 B 农场.从 A 农场到 B 农场中有 n- 个路口,分别标上号,A 农场为 号,B 农场为 ...

  2. 冲刺Noip2017模拟赛1 解题报告——五十岚芒果酱

    题1 国际象棋(chess) [问题描述] 有N个人要参加国际象棋比赛,该比赛要进行K场对弈.每个人最多参加2场对弈,最少参加0场对弈.每个人都有一个与其他人都不相同的等级(用一个正整数来表示).在对 ...

  3. 20161005 NOIP 模拟赛 T2 解题报告

    beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...

  4. 冲刺Noip2017模拟赛5 解题报告——五十岚芒果酱

    1. 公约数(gcd) [问题描述] 给定一个正整数,在[,n]的范围内,求出有多少个无序数对(a,b)满足 gcd(a,b)=a xor b. [输入格式] 输入共一行,一个正整数n. [输出格式] ...

  5. 冲刺Noip2017模拟赛3 解题报告——五十岚芒果酱

    题1  素数 [问题描述] 给定一个正整数N,询问1到N中有多少个素数. [输入格式]primenum.in 一个正整数N. [输出格式]primenum.out 一个数Ans,表示1到N中有多少个素 ...

  6. LOJ 2664. 「NOI2013」向量内积 解题报告

    #2664. 「NOI2013」向量内积 两个 \(d\) 维向量 \(A=[a_1, a_2 ,...,a_d]\) 与 \(B=[b_1 ,b_2 ,...,b_d]\) 的内积为其相对应维度的权 ...

  7. 20161023 NOIP 模拟赛 T2 解题报告

    Task 2.回文串计数 (calc.pas/calc.c/calc.cpp) [题目描述] 虽然是一名理科生,Mcx常常声称自己是一名真正的文科生.不知为何,他对于背诵总有一种莫名的热爱,这也促使他 ...

  8. 20161003 NOIP 模拟赛 T2 解题报告

    Weed duyege的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,duyege 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 ...

  9. 20161005 NOIP 模拟赛 T3 解题报告

    subset 3.1 题目描述 一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作 1. add s 在集合中加入数字 s. 2. del s 在集合中删除数字 s.保证 s 存在 3. c ...

随机推荐

  1. Floodlight 中创建消息对象的方法

            在 floodlight 中创建各种openflow message 和 action 等採用的是简单工厂方式.BasicFactory类(实现OFMessageFactory接口.) ...

  2. linux下tomcat开机启动简单配置

    1.个人标记 caicongyang http://blog.csdn.net/caicongyang 2.正文 在linux文件/etc/rc.d/rc.local的末尾加入例如以下行就可以: ex ...

  3. CSS文本简单设置

    文本的设置直接影响到用户对界面的感受,好的文本设置能够让用户对界面有一种赏心悦目的感受,在这地方我们来简单的说说说对文本设置的时候,有哪些格式. 文本设置的时候我们应该注意什么: 平时我们文本设置的时 ...

  4. Android上方便地开发的C程序

    假设你基于没有一个专门的开发板练手.那你的Android手机也能够开发大多数C应用程序.安装好后编译C的编译器. 本文仅仅写一个Hello World的执行过程. 长处是:不须要eclipse,不须要 ...

  5. bzoj4568: [Scoi2016]幸运数字(LCA+线性基)

    4568: [Scoi2016]幸运数字 题目:传送门 题解: 好题!!! 之前就看过,当时说是要用线性基...就没学 填坑填坑: %%%线性基 && 神犇 主要还是对于线性基的运用和 ...

  6. jq弹窗(获取页面宽高,滚轮高度,始终居中)

    jq写一个弹窗,效果如上图所示, 点击按钮弹窗弹出,右上角关闭. 弹窗始终显示在页面中间,无论放大缩小窗口,滚轮滚动. 代码如下: html: <br><br><br&g ...

  7. Android 那些年,处理getActivity()为null的日子

    在日常开发中的时候,我们经常会使用ViewPager+Fragment进行视图滑动,在某些部分逻辑也许我们需要利用上下文Context(例如基本的Toast),但是由于Fragment只是衣服在Act ...

  8. 50个极好的bootstrap框架

    转自:http://sudasuta.com/bootstrap-admin-templates.html  https://www.cnblogs.com/sanhao/p/9184323.html ...

  9. STM8S103汇编文档和注意

    1.官方文档<STM8 CPU programming manual>介绍了指令和寻址方式 2.辅助类文档,boot loader文档<STM8 bootloader> 3.关 ...

  10. 数据库用varchar存储时间时会出现时间差解决办法

    用varchar存储时间,最后提取数据库时间字段会出现时间差问题. 当我们调用数据库时间字段时,会出现时间差,使得查询的数据查询不到,解决办法如下 CAST( 字段名as DATE) between ...