[NOI2013模拟] BZOJ4705 棋盘游戏 解题报告(组合计数)
莫名打不开这道题的链接,请读者自行搜索
Description
行操作是指选定某一行,将这行所有格子的颜色取反(黑白互换)。
列操作是指选定某一列,将这列所有格子的颜色取反。
XX进行了R次行操作C次列操作(可能对某行或者某列操作了多次),最后棋盘上有S个黑色格子。
问有多少种不同的操作方案。两种操作方案不同,当且仅当对某行或者某列操作次数不同(也就是说与操作的顺序无关)。
方案数可能很大,输出它对10^9+7取模的结果。
Input
Output
Sample Input
2 2 2 2 4
Sample Output
4
Data Constraint
对于60%的数据,满足N,M,R,C≤1500。
对于100%的数据,满足N,M,R,C≤100000,0≤S≤N*M。
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 棋盘游戏 解题报告(组合计数)的更多相关文章
- 冲刺Noip2017模拟赛2 解题报告——五十岚芒果酱
题1 牛跑步(running) [题目描述] 新牛到部队,CG 要求它们每天早上搞晨跑,从 A 农场跑到 B 农场.从 A 农场到 B 农场中有 n- 个路口,分别标上号,A 农场为 号,B 农场为 ...
- 冲刺Noip2017模拟赛1 解题报告——五十岚芒果酱
题1 国际象棋(chess) [问题描述] 有N个人要参加国际象棋比赛,该比赛要进行K场对弈.每个人最多参加2场对弈,最少参加0场对弈.每个人都有一个与其他人都不相同的等级(用一个正整数来表示).在对 ...
- 20161005 NOIP 模拟赛 T2 解题报告
beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...
- 冲刺Noip2017模拟赛5 解题报告——五十岚芒果酱
1. 公约数(gcd) [问题描述] 给定一个正整数,在[,n]的范围内,求出有多少个无序数对(a,b)满足 gcd(a,b)=a xor b. [输入格式] 输入共一行,一个正整数n. [输出格式] ...
- 冲刺Noip2017模拟赛3 解题报告——五十岚芒果酱
题1 素数 [问题描述] 给定一个正整数N,询问1到N中有多少个素数. [输入格式]primenum.in 一个正整数N. [输出格式]primenum.out 一个数Ans,表示1到N中有多少个素 ...
- LOJ 2664. 「NOI2013」向量内积 解题报告
#2664. 「NOI2013」向量内积 两个 \(d\) 维向量 \(A=[a_1, a_2 ,...,a_d]\) 与 \(B=[b_1 ,b_2 ,...,b_d]\) 的内积为其相对应维度的权 ...
- 20161023 NOIP 模拟赛 T2 解题报告
Task 2.回文串计数 (calc.pas/calc.c/calc.cpp) [题目描述] 虽然是一名理科生,Mcx常常声称自己是一名真正的文科生.不知为何,他对于背诵总有一种莫名的热爱,这也促使他 ...
- 20161003 NOIP 模拟赛 T2 解题报告
Weed duyege的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,duyege 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 ...
- 20161005 NOIP 模拟赛 T3 解题报告
subset 3.1 题目描述 一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作 1. add s 在集合中加入数字 s. 2. del s 在集合中删除数字 s.保证 s 存在 3. c ...
随机推荐
- 【SPOJ-GSHOP】Rama and Friends【贪心】【细节】
题意: 给出n个非严格递增的整数(可能有负数),必须操作k次.每次能够把当中一个数变为它的相反数,使得终于的数列和最大. 输出这个最大和. 考验怎样出坑数据卡自己的程序... #include < ...
- 浅析Java抽象类和接口的比較
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是因为这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和inte ...
- Educational Codeforces Round 6 C. Pearls in a Row set
C. Pearls in a Row There are n pearls in a row. Let's enumerate them with integers from 1 to n from ...
- android 处理Back键按下事件
package com.example.keyevent; import android.os.Bundle; import android.view.KeyEvent; import android ...
- .net core @Html 自定义属性中包含特殊符号解决
最近自己在练手项目用到了VUE 绑定属性的时候发现 有: -符号 这样显然是不支持的.之前发现 v-on 这种-符号也是不支持的 但是可用 @v_on 替代.可是找遍了所有资料也没找到:转义符 当时 ...
- BZOJ 2194 FFT
思路: 题目中给的是差值一定的 那么就把b数组倒一下 不就变成 i+j=k(k为定值的了嘛) 嗯 然后搞个FFT //By SiriusRen #include <cstdio> #inc ...
- MapReduce 程序:WordCount
- sql server 去掉某字段左边的0
比如:将以下Code字段 Code 000 001 002 ... 009 010 依次去掉左边的0,000替换为0,001替换为1,010替换为10,以此类推 Code 0 1 2 ... 9 10 ...
- miniUI打开一个新的画面(ondestroy)
转自:http://blog.csdn.net/u012934325/article/details/77914691 需求:开发中需求通过点击父界面一个按钮弹出一个子界面,在miniUI中我们可以这 ...
- HDU 2122 Ice_cream’s world III【最小生成树】
解题思路:基础的最小生成树反思:不明白为什么i从1开始取,就一直WA,难道是因为村庄的编号是从0开始的吗 Ice_cream’s world III Time Limit: 3000/1000 MS ...