HDU 4869 Turn the pokers

题目链接

题意:给定n个翻转扑克方式,每次方式相应能够选择当中xi张进行翻转。一共同拥有m张牌。问最后翻转之后的情况数

思路:对于每一些翻转,假设能确定终于正面向上张数的情况,那么全部的情况就是全部情况的C(m, 张数)之和。那么这个张数进行推理会发现,事实上会有一个上下界,每隔2个位置的数字就是能够的方案,由于在翻牌的时候,相应的肯定会有牌被翻转,而假设向上牌少翻一张,向下牌就要多翻一张。奇偶性是不变的,因此仅仅要每次输入张数,维护上下界,最后在去求和就可以

代码:

#include <cstdio>
#include <cstring> typedef long long ll;
const ll MOD = 1000000009;
const int N = 100005;
int n, m, num;
ll fac[N]; ll exgcd(ll a, ll b, ll &x, ll &y) {
if (!b) {x = 1; y = 0; return a;}
ll d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
} ll inv(ll a, ll n) {
ll x, y;
exgcd(a, n, x, y);
return (x + n) % n;
} ll C(int n, int m) {
return fac[n] * inv(fac[m] * fac[n - m] % MOD, MOD) % MOD;
} int main() {
fac[0] = 1;
for (ll i = 1; i < N; i++)
fac[i] = fac[i - 1] * i % MOD;
while (~scanf("%d%d", &n, &m)) {
scanf("%d", &num);
int up = num;
int down = num;
for (int i = 1; i < n; i++) {
scanf("%d", &num);
int up2 = m - down;
int down2 = m - up;
if (num >= down && num <= up)
down = ((down&1)^(num&1));
else if (num < down) down = down - num;
else down = num - up; if (num >= down2 && num <= up2) {
up = m - ((up2&1)^(num&1));
}
else if (num < down2) {
up = m - (down2 - num);
}
else up = m - (num - up2);
}
ll ans = 0;
for (int i = down; i <= up; i += 2) {
ans = (ans + C(m, i)) % MOD;
}
printf("%lld\n", ans);
}
return 0;
}

HDU 4869 Turn the pokers(推理)的更多相关文章

  1. hdu 4869 Turn the pokers (2014多校联合第一场 I)

    Turn the pokers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. HDU 4869 Turn the pokers(思维+组合公式+高速幂)

    pid=4869" target="_blank">Turn the pokers 大意:给出n次操作,给出m个扑克.然后给出n个操作的个数a[i],每一个a[i] ...

  3. HDU 4869 Turn the pokers (2014 Multi-University Training Contest 1)

    Turn the pokers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  4. hdu 4869 Turn the pokers (思维)

    Turn the pokers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. HDU 4869 Turn the pokers (2014多校联合训练第一场1009) 解题报告(维护区间 + 组合数)

    Turn the pokers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. hdu 4869 Turn the pokers(组合数+费马小定理)

    Problem Description During summer vacation,Alice stay at home for a long time, with nothing to do. S ...

  7. HDU 4869 Turn the pokers (2014 多校联合第一场 I)

    HDOJ--4869--Turn the pokers[组合数学+快速幂] 题意:有m张扑克,开始时全部正面朝下,你可以翻n次牌,每次可以翻xi张,翻拍规则就是正面朝下变背面朝下,反之亦然,问经过n次 ...

  8. 2014多校第一场 I 题 || HDU 4869 Turn the pokers(费马小定理+快速幂模)

    题目链接 题意 : m张牌,可以翻n次,每次翻xi张牌,问最后能得到多少种形态. 思路 :0定义为反面,1定义为正面,(一开始都是反), 对于每次翻牌操作,我们定义两个边界lb,rb,代表每次中1最少 ...

  9. HDU 4869 Turn the pokers(思维+逆元)

    考试的时候没有做出来... 想到了答案一定是一段连续的区间,一直在纠结BFS判断最后的可行1数. 原来直接模拟一遍就可以算出来最后的端点... 剩下的就是组合数取模了,用逆元就行了... # incl ...

随机推荐

  1. <转载>网页设计中的F式布局

    地址:http://www.uisdc.com/understanding-the-f-layout-in-web-design 网页设计中的F式布局 今天我们来重点介绍网页设计中的F式布局.传统的布 ...

  2. html网页中 点击按钮页面跳转

    在html页面中 实现点击按钮页面跳转.语句如下: <input type="button" value="跳转" onClick="windo ...

  3. hbase:应用开发

    开发环境: hadoop: hadoop-1.1.2 hbase: hbase-0.94.11-security eclipse:Juno Service Release 2 配置Eclipse 通过 ...

  4. JS - 侧边导航收缩伸展

    下载地址:http://www.lanrentuku.com/js/daohang-1162.html

  5. Android broadcast

    发送广播而且接受.发送两个广播 Intent intent = new Intent(); intent.setAction("com.wxq.CUSTOM_INTENT"); s ...

  6. VC++实现位图显示透明效果--实现原理

    我们在进行程序的界面设计时,常常希望将位图的关键部分,也既是图像的前景显示在界面上,而将位图的背景隐藏起来,将位图与界面很自然的融合在一起,本文介绍了透明位图的制作知识,并将透明位图在一个对话框中显示 ...

  7. JSTL解析——002——core标签库01

    javaEE5之前的版本需要引用JSTL相关的jar包.tld文件等,JAEE5之后就不用这么麻烦了, 如果你的还是不能使用就去官网下载(jstl.jar和standard.jar)这两个jar包,将 ...

  8. linux—select具体解释

    linux—select具体解释 select系统调用时用来让我们的程序监视多个文件句柄的状态变化的.程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变. 关于文件句柄,事 ...

  9. typedef和define具体的具体差别

      1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,仅仅有在编译已被展开的源程序时才会发现可能的错误并报错.比如: #define PI 3. ...

  10. android binder机制之——(创建binder服务)

      Binder机制编程 前面的几篇文章具体介绍了android中binder机制的方方面面,相信你对binder机制已经有了较深刻的理解.俗话说得好"学以致用",以下我们就通过在 ...