[hdu 4869](14年多校I题)Turn the pokers 找规律+拓欧逆元
Turn the pokers
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 316 Accepted Submission(s): 101
Problem Description
During summer vacation,Alice stay at home for a long time, with nothing to do. She went out and bought m pokers, tending to play poker. But she hated the traditional gameplay. She wants to change. She puts these pokers face down, she decided to flip poker n
times, and each time she can flip Xi pokers. She wanted to know how many the results does she get. Can you help her solve this problem?
Input
The input consists of multiple test cases.
Each test case begins with a line containing two non-negative integers n and m(0<n,m<=100000).
The next line contains n integers Xi(0<=Xi<=m).
Output
Output the required answer modulo 1000000009 for each test case, one per line.
Sample Input
3 4
3 2 3
3 3
3 2 3
Sample Output
8
3
Hint
For the second 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)
题目大意
给定M张牌,能够翻转N次。每次能够翻转恰好Xi张牌。刚開始牌面所有朝下,问经过N次翻转之后可能产生的扑克序列数(如例子hint)。
解题思路
现场还是没出……想到dp的思路但复杂度高达N^2.
能够观察到,我们最后正面朝上的牌的数量奇偶总是一定的(如1,3。5),由于不同奇偶情况就须要至少多翻一次,但翻动的次数已经固定不能更改。
考虑一次翻转,最多X1张牌正面朝上了。最少也是X1张。
假设第二次仅仅翻转1张,再设1<X1<m 则最多会有X1+1张牌正面朝上,最少会有X1-1张牌正面朝上。
如今如果我们已经翻好k-1次
最多a张正面朝上,最少b张正面朝上
假设b>=Xk 则翻转后最少有b-Xk张正面朝上(其余的情况能够一次翻一张正面的,一张反面的。情况保持不变)。
否则。假设a>Xk。这时最少会有0张或1张正面朝上(依据a和Xk的奇偶性推断),
再否则,最少会有Ak-a张正面朝上(先把正面朝上的所有翻转,剩下的再翻便是最少张数)
关于最大值的讨论同理
最后关于组合数的计算,因为m固定不变,就能够依据组合数公式C(m,n)=C(m-1,n)*(n-m+1)/m 线性求解。因为1e9+9是大素数。除法操作可用逆元求解取代。
#include <cstdio>
#define LL long long
int n,m;
LL mod=1000000009;
LL a[100005];
void egcd(LL a,LL b,LL &x,LL &y)
{
if (b==0)
{
x=1;y=0;
return ;
}
egcd(b,a%b,x,y);
LL t=x;
x=y,y=t-a/b*y;
return;
}
LL cal(LL x,LL y)
{
LL cur=1,tmp=0,t=0;
while(t<=y)
{
if (t>=x&&t<=y)
if ((t-x)%2==0) tmp=(tmp+cur)%mod;
t++;
cur=cur*(m-t+1)%mod;
LL t1,t2;
egcd(t,mod,t1,t2);
t1=(t1+mod)%mod;
cur=cur*t1%mod;
}
return tmp;
}
int main()
{
while (~scanf("%d%d",&n,&m)){
LL upper,lower,plower,pupper;
for (int i=1;i<=n;i++)
scanf("%I64d",&a[i]);
upper=lower=pupper=plower=0;
for (int i=1;i<=n;i++)
{
if (plower>=a[i]) lower-=a[i];
else if (pupper>=a[i]) lower=0+((pupper+a[i])%2==1);
else lower=a[i]-pupper;
if (pupper+a[i]<=m) upper+=a[i];
else if (plower+a[i]<=m) upper=m-((plower+a[i])%2==1);
else {upper=m-(plower+a[i]-m);}
plower=lower;//plower代表上一步的最小值
pupper=upper;//pupper代表上一步的最大值
}
printf("%I64d\n",cal(lower,upper));
}
return 0;
}
[hdu 4869](14年多校I题)Turn the pokers 找规律+拓欧逆元的更多相关文章
- Just Random HDU - 4790 思维题(打表找规律)分段求解
Coach Pang and Uncle Yang both love numbers. Every morning they play a game with number together. In ...
- hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)
Nim or not Nim? Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Sub ...
- hdu 6045: Is Derek lying? (2017 多校第二场 1001)【找规律】
题目链接 可以暴力找一下规律 比如,假设N=7,两人有5题相同,2题不同,枚举X=0->15时,Y的"Not lying"的取值范围从而找出规律 #include<bi ...
- HDU 5033 Building(北京网络赛B题) 单调栈 找规律
做了三天,,,终于a了... 11724203 2014-09-25 09:37:44 Accepted 5033 781MS 7400K 4751 B G++ czy Building Time L ...
- hdu 6050: Funny Function (2017 多校第二场 1006) 【找规律】
题目链接 暴力打个表找下规律就好了,比赛时看出规律来了倒是,然而看这道题看得太晚了,而且高中的那些数列相关的技巧生疏了好多,然后推公式就比较慢..其实还是自身菜啊.. 公式是 #include< ...
- JAVA常见算法题(三十二)---找规律
题目一: 4,5,15,45,135,405,__ 题目二: 524,244,954,674,394,15,725, __ 题目三: 7,8,6,9,10,7,4,4,5,__ 求横线位置的整数. * ...
- HDU 5793 A Boring Question (找规律 : 快速幂+逆元)
A Boring Question 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5793 Description Input The first l ...
- hdu 3032 Nim or not Nim? (sg函数打表找规律)
题意:有N堆石子,每堆有s[i]个,Alice和Bob两人轮流取石子,可以从一堆中取任意多的石子,也可以把一堆石子分成两小堆 Alice先取,问谁能获胜 思路:首先观察这道题的数据范围 1 ≤ N ...
- hdu 5978 To begin or not to begin(概率,找规律)
To begin or not to begin Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java ...
随机推荐
- PHP面向对象摘要
一.面向对象的三种特性,分别是封装性,继承性和多态性. 1.封装性:封装是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体的实现细节,这就是封装思想. 2.继承性:继承性主要是描述 ...
- ruby 正则表达式 匹配规则
- C#中抽象类与接口的区别
1.面向接口编程和面向对象编程是什么关系 首先,面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分.或者说,它是面向对象 ...
- CLR之委托的揭秘(一)
初识委托: 在之前的学习中我们已经可以把对象,值,数组当作参数传递给方法,但是有没有可能把方法也当作参数传递给方法呢?有了这个想法于是就有了委托.方法当作一种参数去传递,但是方法有的 ...
- python中print()函数的“,”与java中System.out.print()函数中的“+”
python中的print()函数和java中的System.out.print()函数都有着打印字符串的功能. python中: print("hello,world!") 输出 ...
- shopxx--权限功能测试
shiro权限控制 一.添加角色 1.打开 系统→角色管理,点击 添加 赋予当前角色对应的权限 二.添加管理员(即用户管理) 添加用户,赋予刚才添加的角色 三.用新用户登录,进行测试 登录结果
- 算法帖——用舞蹈链算法(Dancing Links)求解俄罗斯方块覆盖问题
问题的提出:如下图,用13块俄罗斯方块覆盖8*8的正方形.如何用计算机求解? 解决这类问题的方法不一而足,然而核心思想都是穷举法,不同的方法仅仅是对穷举法进行了优化 用13块不同形状的俄罗斯方块(每个 ...
- 《Linux命令行与shell脚本编程大全》第十八章 图形化桌面环境中的脚本编程
18.1 创建文本菜单 直接上例子吧: 1 #!/bin/bash 2 function menu 3 { 4 clear 5 echo 6 ...
- Mysql--单表数据记录查询
1.简单数据记录查询 1.1 简单数据查询 1.1.1 查询所有字段数据 例子: 1.1.2 "*"符号的使用 语法: 例子: 1.1.3 查询指定字段数据 例子: ...
- php 7.2 一些注意事项.
<?php $b = array(); each($b); // Deprecated: The each() function is deprecated. This message will ...