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)(每一次合并操作其实就是两次翻转)
.
.
.
.
.
.

程序:
#include<iostream>
using namespace std;int mod=1000000007;
int n,m,r,c,max1;
long long  s;
int jie[200001],inv[200001];int work(int x,int y)
{int ans=1;for (;y;y=y/2,x=1ll*x*x%mod)if (y&1) ans=1ll*ans*x%mod;return ans;
}
int h(int m,int n)
{if (m<0||n<0||n>m) return 0;return 1ll*jie[m]*inv[n]%mod*inv[m-n]%mod;
}
void jb()
{jie[0]=inv[0]=1;for (int i=1;i<=max1*2;i++) jie[i]=1ll*jie[i-1]*i%mod;for (int i=1;i<=max1*2;i++) inv[i]=1ll*inv[i-1]*work(i,mod-2)%mod;
}
int main()
{int ans=0;cin>>n>>m>>r>>c>>s;max1=max(max(n,m),max(r,c));jb();for (int i=0;i<=min(n,r);i++){if (i*2==n) {if ((r-i)&1||s!=1ll*n*m/2) continue;ans=(ans+1ll*h(n,i)*h((r-i)/2+n-1,n-1)%mod*h(c+m-1,m-1)%mod)%mod;    }else {    if ((s-1ll*i*m)%(n-2*i)!=0) continue;int j=(s-1ll*i*m)/(n-2*i); if ((r-i)&1||(c-j)&1||j<0||j>c) continue;ans=(ans+1ll*h(n,i)*h(m,j)%mod*h((r-i)/2+n-1,n-1)%mod*h((c-j)/2+m-1,m-1)%mod)%mod;}}cout<<ans;return 0;
}

转载于:https://www.cnblogs.com/YYC-0304/p/9499932.html

【NOI2013模拟】棋盘游戏相关推荐

  1. [JZOJ3347] 【NOI2013模拟】树的难题

    题目 题目大意 给你一棵树,每个节点有三种黑.白.灰三种颜色. 你要割掉一些边(每条边被割需要付出一定的代价),使得森林的每棵树满足: 没有黑点或至多一个白点. 思考历程 这题一看就知道是一个树形DP ...

  2. 3360. 【NOI2013模拟】苹果树

    题目描述 神犇家门口种了一棵苹果树.苹果树作为一棵树,当然是呈树状结构,每根树枝连接两个苹果,每个苹果都可以沿着一条由树枝构成的路径连到树根,而且这样的路径只存在一条.由于这棵苹果树是神犇种的,所以苹 ...

  3. 学习手记(2019/7/05~2019/8/31)——快乐暑假

    文章目录 二分答案的作用 堆和区间 很糙ddp 线段树合并 网络流结论の1 树上莫队 对角线与GCD 区间与扫描线与方案数 欧拉欧拉*1 斯坦纳树 切比雪夫距离 二分匹配结论の1 min-max容斥 ...

  4. 欢乐纪中某A组赛【2019.7.12】

    前言 暴力写挂垫底了呀\huge \color{red}\texttt{暴力写挂}\small\color{white}\\\texttt{垫底了呀}暴力写挂垫底了呀 %%%ZZYrank1\text ...

  5. 欢乐纪中某A组赛【2019.7.10】

    前言 好烦我最后写对了T1T1T1的808080分结果交错题导致T2T2T2的404040分没了T1T1T1也没拿多那些分. 话说好像ZDYZDYZDY比我还惨 成绩 这里还是按OJOJOJ上的分数排 ...

  6. 欢乐纪中某A组赛【2019.7.9】

    前言 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 心 ...

  7. 2019纪中暑假游记+总结

    Travels总篇\texttt{Travels总篇}Travels总篇 7/4\texttt{7/4}7/4 下午才去纪中,早上就一大早和同学出去玩,看了蜘蛛侠然后到3点多才出发. 因为走南沙大桥所 ...

  8. 从α到μ:DeepMind棋盘游戏AI进化史

    2020-02-04 13:52:45 选自towardsdatascience 作者:Connor Shorten 机器之心编译 参与:Panda.蛋酱 alpha(α)是希腊字母表的第 1 个字母 ...

  9. 【DP】[NOI2013]书法家

    题目描述 小 E 同学非常喜欢书法,他听说 NOI2013 已经开始了,想题一幅 "NOI" 的字送给大家. 小 E 有一张非常神奇的纸,纸可以用一个 n 行 m 列的二维方格矩阵 ...

最新文章

  1. c语言课程设计坦克大战,funcodec++课程设计_坦克大战
  2. java随机数去重排序_数组去重及排序/0~10随机数字/字符串中出现最多的字符及次数...
  3. AXI quad SPI没有输出
  4. html+css+javascript之间的关系与作用
  5. 类的构造函数(分类和调用)
  6. php 数组的格式,PHP文件格式数组
  7. java中spring的web支持nio,Spring WebClient NIO功能和问题域,与Spring Webflux一起使用
  8. 腾讯地图拾取坐标html,腾讯地图Api 实现拾取坐标功能示例
  9. mysql数据库教程全解_MySQL数据库基础教程详解
  10. 20-10-026-安装-KyLin-2.6.0-单机版安装(MAC官网下载)-spark引擎
  11. 编程中无穷大常量的设定技巧 2014-08-19 09:22 35人阅读 评论(0) 收藏...
  12. iOS 视频播放器旋转问题小结
  13. android版自动点击器,自动点击器安卓低配版
  14. JAVA中三个点“...”是什么意思
  15. C++14新特性:deprecated的含义与使用?
  16. Proteus:logic contentions detected on net B15
  17. python培训总结心得
  18. python做web后端_最简易的python web框架的后端实现
  19. 微信图片服务器逻辑,微信小程序[第八篇] -- 实现完整的相册列表逻辑(小程序端服务器端)...
  20. 【Python】QQ群聊天记录提取

热门文章

  1. 科大星云诗社动态20210420
  2. 科大星云诗社动态20210601
  3. 科大星云诗社动态20211205
  4. 《能源专业的展望及其未来择业方向的分析》
  5. 第01课:深度学习概述
  6. 独立成分分析 ( ICA ) 与主成分分析 ( PCA )再解析
  7. 结构张量用于区分平坦、边缘、角点区域
  8. 30分钟掌握ES6/ES2015核心内容(上)
  9. python 遍历目录或文件
  10. 元器件基础知识--排阻命名