Turn the pokers

大意:给出n次操作,给出m个扑克。然后给出n个操作的个数a[i],每一个a[i]代表能够翻的扑克的个数,求最后可能出现的扑克的组合情况。

Hint

Sample Input:

3 3

3 2 3

For the this example:

0 express face down,1 express face up

Initial state 000

The first result:000->111->001->110

The second result:000->111->100->011

The third result:000->111->010->101

So, there are three kinds of results(110,011,101)

思路:要说清楚不是非常easy。官方题解是这么说的:

“终于的结果一定是连续出现的,仅仅须要求出终于的区间。

由于假设对同一张牌进行两次操作,牌的状态不改变。故牌的翻转次数一定是降低偶数次。假设全部数的和是奇数,那么终于结果也一定是奇数。同理,偶数也是一样的。

所以仅仅要递推求出最后的区间,计算sum(C(xi。m)(i=0,1,2。。。))。m是总牌数,xi是在区间内连续的奇数或偶数,在模10^9+9就是终于的答案。”

#define LL long longconst int MOD = 1000000009;
LL J[100005];void Init()
{///初始化阶乘表J[0] = 1;for(int i = 1; i <= 100005; ++i){J[i] = J[i-1]*i%MOD;}
}///高速幂取模
LL modexp(LL a,LL b,LL n)
{LL ret=1;LL tmp=a;while(b){if(b&1) ret=ret*tmp%n;tmp=tmp*tmp%n;b>>=1;}return ret;
}
///求组合数 逆元 C(n, m) = n! * (m!*(n-m)!)^(MOD-2)
LL C(LL n, LL m)
{return J[n]*modexp(J[m]*J[n-m]%MOD, MOD-2, MOD)%MOD;
}int a[100010];int main()
{int n, m;Init();while(~scanf("%d%d", &n, &m)){for(int i = 0; i < n; ++i){scanf("%d", &a[i]);}int l = 0;int r = 1;int t = 0;for(int i = 0; i < n; ++i){int ll = min(abs(l-a[i]), abs(r-a[i]));if(l <= a[i] && r >= a[i]){ll = 0;}int rr = max(m-abs(l+a[i]-m), m-abs(r+a[i]-m));if(l <= m-a[i] && r >= m-a[i]){rr = m;}t = (t+a[i])%2;l = ll;r = rr;}long long ans = 0;for(int i = l; i <= r; ++i){if(i%2 == t){ans += C(m, i);ans %= MOD;}}printf("%I64d\n", ans);}return 0;
}
//官方题解的解组合
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<cmath>
using namespace std;
int a[100005];
__int64 pmod = 1000000009;
__int64 inv[100005];
__int64 ba[100005];
__int64 rba[100005];
#define M 100005
void pre() {inv[0] = inv[1] = 1;ba[0] = ba[1] = 1;rba[0] = rba[1] = 1;for (int i = 2; i < M; i++) {inv[i] = ((pmod - pmod / i) * inv[pmod % i]) % pmod;ba[i] = (ba[i - 1] * i)%pmod;rba[i] = (rba[i - 1] * inv[i])%pmod;}
}
__int64 C(int n, int k) {return (ba[n] * rba[k] % pmod )* rba[n - k] % pmod;
}

HDU 4869 Turn the pokers(思维+组合公式+高速幂)相关推荐

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

    Turn the pokers 大意:给出n次操作,给出m个扑克,然后给出n个操作的个数a[i],每个a[i]代表可以翻的扑克的个数,求最后可能出现的扑克的组合情况. Hint Sample Inpu ...

  2. CodeForces - 1008D - Pave the Parallelepiped (容斥原理+重复组合公式+状态压缩+思维)

    题目链接: http://codeforces.com/problemset/problem/1008/D 前置知识: 1.容斥原理:(见百度百科) https://baike.baidu.com/i ...

  3. 排列公式和组合公式_排列与组合:排列公式与组合公式之间有什么区别?

    排列公式和组合公式 Here's the short version. 这是简短的版本. Let's take ringing bells in a church as an example. 让我们 ...

  4. 蓝桥杯-组合公式求值(java)

    算法提高 组合公式求值 时间限制:1.0s 内存限制:256.0MB问题描述给定n, m,求:输入格式输入一行,包含两个整数n, m.输出格式输出一行,包含求得的值,由于答案可能非常大,请输出此公式除 ...

  5. 阶乘、排列、组合 公式计算

    阶乘.排列.组合 公式计算 引自:http://wy19880318.blog.163.com/blog/static/3615147220090385546818/ ... 阶乘.排列.组合 公式计 ...

  6. 排列组合公式 与24点编程游戏

    排列组合公式 此外, 规定0! = 1. 24点游戏编程问题 问题描述 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24. 示例 1: 输入: [ ...

  7. java股票公式源码_20个最牛抄底公式及2个组合公式源码

    好股票软件下载网(www.goodgupiao.com)提示:您正在下载的是:20个最牛抄底公式及2个组合公式源码 20个最牛抄底公式及2个组合公式源码 {金牛起步} XA_1:=VOL XA_2:= ...

  8. 组合公式计算机,组合数公式

    组合数公式是指从 n 个不同元素中,任取 m(m≤n) 个元素并成一组,叫做从 n 个不同元素中取出 m 个元素的一个组合:从 n 个不同元素中取出 m(m≤n) 个元素的所有组合的个数,叫做 n 个 ...

  9. python求组合数c_python实现排列组合公式C(m,n)求值

    python实现排列组合公式C(m,n)求值 实验六 理解浮点数运算的误差 实验目的: 1.理解组合数定义式的化简 2.理解浮点数运算的误差可能带来的问题 错误代码 def func(m,n): re ...

最新文章

  1. 【PHPExcel】生成xls文件并下载
  2. Spring(二)——IoC
  3. ZOJ3953 Intervals
  4. 第一章 python大数据分析概述
  5. 如何在虚拟机linux下运行程序吗,在Linux上运行虚拟机的3种方法 | MOS86
  6. bat快捷方式启动局域网共享文件
  7. 通过TCP/IP实现PC(客户端)远程控制开发板(服务器)上LED灯的实验
  8. Android聊天软件开发(基于网易云IM即时通讯)——发送文本消息(四)
  9. 【luogu CF633H】Fibonacci-ish II(莫队)(线段树)(矩阵乘法)
  10. How-To-Ask-Questions-The-Smart-Way(提问的智慧)
  11. 从“制造大国”走向“制造强国”——“两化深度融合”是必然选择 考题答案
  12. 2013年计算机毕业生流向,2013年计算机专业应届毕业生自我鉴定
  13. 单克隆抗体WuT9/甘草次酸-氟尿嘧啶偶联顺铂/RGD肽修饰聚谷氨酸-顺铂复合物的制备
  14. ## Myql的常见命令及语法规范
  15. Word排版——毕业论文专业排版5——目录
  16. Python之校庆代码
  17. VS报错之混合模式程序集是针对“v1.1.4322”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。...
  18. 百分制转五分制(java)
  19. 企业微信公费电话怎么使用?
  20. 智慧养殖远程管理监控方案

热门文章

  1. Visual Studio 2005 Web Deployment Projects版本不同引发的问题
  2. 解析C语言中的sizeof
  3. 从零开始学ASP.NET(基础篇)
  4. 拖放 DataGrid 列--来自MSDN
  5. C++拾取——使用stl标准库实现排序算法及评测
  6. Ubuntu14.04上安装TensorRT 2.1操作步骤
  7. Caffe中对MNIST执行train操作执行流程解析
  8. 设计模式之建造者模式(生成器模式、Builder)摘录
  9. wamp安装多版本php,WampServer安装多个php版本
  10. android联动动画,利用 CollapsingToolbarLayout 完成联动的动画效果