分析:这道题比较有难度.

观察题目,发现只有当一行翻了奇数次后才会产生黑色格子,设有x行被翻了奇数次,y列被翻了偶数次,那么x*m + y*n - 2*x*y = s,接下来就要解方程了.对于二元一次方程,先枚举其中一个未知数x,就能推得y = (s - x*m)/(n - 2*x).假设翻了奇数次的x行y列各只用x,y次操作,那么接下来的任务就是把剩下的没用完的次数给分配出去,而且不能改变奇偶性.如果每一次操作是把一行或一列翻两次,那么就是要把(r - x)/2次操作分给n行,(c - y)/2次操作分给m列,这个的方案数可以用隔板法来求解,即:

C((r - x) / 2 + n - 1,n - 1),C((c - y) / 2 + m - 1,m - 1),n行m列中选x行y列的方案数为C(n,x),

C(m,y),那么答案就是C((r - x) / 2 + n - 1,n - 1)*C((c - y) / 2 + m - 1,m - 1)*C(n,x)*C(m,y).

统计方案数的时候要看y是不是整数,并且r-x和c-y要能被2整除.最后要特判一种情况:x*2=n,在这种情况下,无论多少列被染了奇数次黑色格子永远是那么多,把所有列的情况算一次就好了.

以后取模运算要单独开一个函数写,这样不容易错.

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5.  
  6. const int mod = 1e9 + , maxn = ;
  7.  
  8. using namespace std;
  9. long long p[maxn];
  10. int n, m, r, c;
  11. long long s, v1[maxn], v2[maxn], v3[maxn], v4[maxn], ans;
  12.  
  13. long long mul(long long a, long long b)
  14. {
  15. a *= b;
  16. if (a >= mod)
  17. a %= mod;
  18. return a;
  19. }
  20.  
  21. void inc(long long &a, long long b)
  22. {
  23. a += b;
  24. if (a >= mod)
  25. a -= mod;
  26. }
  27.  
  28. long long qpow(long long a, long long b)
  29. {
  30. long long res = ;
  31. while (b)
  32. {
  33. if (b & )
  34. res = mul(res, a);
  35. b >>= ;
  36. a = mul(a, a);
  37. }
  38. return res;
  39. }
  40.  
  41. int main()
  42. {
  43. scanf("%d%d%d%d%lld", &n, &m, &r, &c, &s);
  44.  
  45. p[] = ;
  46. for (int i = ; i <= ; i++) //逆元
  47. p[i] = ((mod - mod / i) * p[mod % i]) % mod;
  48.  
  49. long long temp = ;
  50. for (int i = ; i <= r; i++) //求C(n + i - 1,n - 1)
  51. {
  52. v1[i] = temp;
  53. temp = mul(temp, mul(i + n, p[i + ]));
  54. }
  55. temp = ;
  56. for (int i = ; i <= c; i++)
  57. {
  58. v2[i] = temp;
  59. temp = mul(temp, mul(i + m, p[i + ]));
  60. }
  61. temp = ;
  62. for (int i = ; i <= n; i++)
  63. {
  64. v3[i] = temp;
  65. temp = mul(temp, mul(n - i, p[i + ]));
  66. }
  67. temp = ;
  68. for (int i = ; i <= m; i++)
  69. {
  70. v4[i] = temp;
  71. temp = mul(temp, mul(m - i, p[i + ]));
  72. }
  73. for (long long i = r & ; i <= min(n, r); i += )
  74. {
  75.  
  76. if (i * != n)
  77. {
  78. if (((s - (long long)m * i)) % (n - i * ))
  79. continue;
  80. long long b = (s - (long long)i * m) / (n - i * );
  81. if (b > c || b < || (c - b) & )
  82. continue;
  83. long long temp = v3[i];
  84. temp = mul(temp, v1[(r - i) >> ]);
  85. temp = mul(temp, v4[b]);
  86. temp = mul(temp, v2[(c - b) >> ]);
  87. inc(ans, temp);
  88. }
  89. else
  90. {
  91. if ((long long)i * m != s)
  92. continue;
  93. long long temp = v3[i];
  94. temp = mul(temp, v1[(r - i) >> ]);
  95. long long cnt = ;
  96. for (int b = (c & ); b <= min(r, c); b += )
  97. inc(cnt, mul(v4[b], v2[(c - b) >> ]));
  98. inc(ans, mul(temp, cnt));
  99. }
  100. }
  101. printf("%lld\n", ans);
  102.  
  103. return ;
  104. }

清北学堂模拟赛d4t6 c的更多相关文章

  1. 清北学堂模拟赛day7 数字碰撞

    /* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include< ...

  2. 清北学堂模拟赛d4t1 a

    分析:大模拟,没什么好说的.我在考场上犯了一个超级低级的错误:while (scanf("%s",s + 1)),导致了死循环,血的教训啊,以后要记住了. /* 1.没有发生改变, ...

  3. 清北学堂模拟赛day7 错排问题

    /* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x ...

  4. 清北学堂模拟赛day7 石子合并加强版

    /* 注意到合并三堆需要枚举两个端点,其实可以开一个数组记录合并两堆的结果,标程好像用了一个神奇的优化 */ #include<iostream> #include<cstdio&g ...

  5. 清北学堂模拟赛d6t6 棋盘迷宫

    3.棋盘迷宫(boardgame.pas/c/cpp)(boardgame.in/out)时间限制:5s/空间限制:256M[题目描述]小 A 和小 Z 是非常要好的朋友, 而且他们都对迷宫游戏非常有 ...

  6. 清北学堂模拟赛d1t2 火柴棒 (stick)

    题目描述众所周知的是,火柴棒可以拼成各种各样的数字.具体可以看下图: 通过2根火柴棒可以拼出数字“1”,通过5根火柴棒可以拼出数字“2”,以此类推. 现在LYK拥有k根火柴棒,它想将这k根火柴棒恰好用 ...

  7. 清北学堂模拟赛d1t1 位运算1(bit)

    题目描述LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值.假设数字N的价值是K,LYK想找到一个 ...

  8. 清北学堂模拟赛d2t6 分糖果(candy)

    题目描述总共有n颗糖果,有3个小朋友分别叫做L,Y,K.每个小朋友想拿到至少k颗糖果,但这三个小朋友有一个共同的特点:对3反感.也就是说,如果某个小朋友拿到3颗,13颗,31颗,333颗这样数量的糖果 ...

  9. 清北学堂模拟赛d2t5 吃东西(eat)

    题目描述一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间a1 ...

随机推荐

  1. html5拨打电话及发短信

    1.最常用WEB页面一键拨号的电话拨打功能 <a href="tel:15088888888">拨号</a> 2.最常用WEB页面一键发送短信功能: < ...

  2. Paratroopers(最小割模型)

    http://poj.org/problem?id=3308 题意:一个m*n的网格,有L位火星空降兵降落在网格中,地球卫士为了能同时消灭他们,在网格的行或列安装了一个枪支,每行或每列的枪支都能消灭这 ...

  3. cookie封装函数(添加,获取,删除)

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  4. 取消安卓listview,scrollview,gridview滑动时候边缘模糊问题

    只需在xml文件里面声明: android:faddingEdge = "none" android:faddingEdgelenth = "0dp" andr ...

  5. eclipse-html插件的安装

    需求:需要在eclipse里面编辑html和jsp,语法高亮和语法提示,自动补全等. 1.下载GEF(依赖包): http://www.eclipse.org/downloads/download.p ...

  6. 【NOIP练习赛】学习

    [NOIP练习赛]T3.学习 Description 巨弱小 D 准备学习,有 n 份学习资料给他看,每份学习资料的 内容可以用一个正整数 ai 表示.小 D 如果在一天内学习了多份资料, 他只能记住 ...

  7. 深入Mysql字符集设置

    作者: Laruence(   ) 本文地址: http://www.laruence.com/2008/01/05/12.html 转载请注明出处 根据Chaos  Wang的PPT整理而成, 在此 ...

  8. hdu2639,第K优决策

    在dp问题中如果遇到问题,没有什么是加一维度不能解决的,如果不能,再加一维度. #include<iostream> #include<cstring> #include< ...

  9. jQuery——val()、text()、html()

    val():获取标签中的value属性的值.带有参数是赋值(类比js中的value属性) text():获取双闭合标签中的文本值.(不识别标签)(类比innerText) html():获取双闭合标签 ...

  10. Centos 安装配置iscsi

    在测试oracle rac的时候用iscsi来模拟磁阵的(真的磁阵需要多路径软件),简单的记录下 #scsi server yum install scsi-target-utils service ...