首页 技术 正文
技术 2022年11月14日
0 收藏 756 点赞 3,685 浏览 3146 个字

Problem DescriptionDuring 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? InputThe 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). OutputOutput the required answer modulo 1000000009 for each test case, one per line. Sample Input3 4
3 2 3
3 3
3 2 3 Sample Output8
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个操作,每次操作选择a[i]张牌进行翻转,问最终得到几个不同的状态思路:在n张牌选k张,很容易想到组合数,但是关键是怎么进行组合数计算呢?我们可以发现,在牌数固定的情况下,总共进行了sum次操作的话,其实有很多牌是经过了多次翻转,而每次翻转只有0和1两种状态,那么,奇偶性就出来了,也就是说,无论怎么进行翻牌,最终态无论有几个1,这些1的总数的奇偶性是固定的。那么我们现在只需要找到最大的1的个数和最小的1的个数,之后我们需要找到最少有i个1,以及最大有j个1;i的情况就是有1就翻1,j的情况就是有0就翻0,而中间的情况时,取偶数步数,一半翻0,一半翻1,保持不变,所以可以确定i,i+2,i+4,…,j-2,j都能被翻到。最后ans=∑C(m,k)(i<=k<=j&&k%2==i%2)。然后再这个区间内进行组合数的求解即可但是又有一个问题出来了,数据很大,进行除法是一个不明智的选择,但是组合数公式必定有除法C(n,m) = n!/(m!*(n-m)!)但是我们知道费马小定理a^(p-1)=1%p那么a^(p-1)/a = 1/a%p 得到 a^(p-2) = 1/a%p发现了吧?这样就把一个整数变成了一个分母!于是便得到sum+=((f[m]%mod)*(quickmod((f[i]*f[m-i])%mod,mod-2)%mod))%mod 

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
using namespace std;
#define N 100006
#define ll long long
#define MOD 1000000009
ll n,m;
ll a[N];
ll fac[N];
ll pow_mod(ll a,ll i)
{
if(i==)
return %MOD;
ll t=pow_mod(a,i/);
ll ans=t*t%MOD;
if(i%==)
ans=ans*a%MOD;
return ans;
}
ll work(ll m,ll i)
{
return ( (fac[m]%MOD)* ( pow_mod(fac[i]*fac[m-i]%MOD ,MOD-)%MOD))%MOD;
} int main()
{
fac[]=;
for(ll i=;i<N;i++) fac[i]=fac[i-]*i%MOD; while(scanf("%I64d%I64d",&n,&m)==)
{
ll x;
ll l=,r=;
ll p,q;
for(ll i=;i<n;i++)
{
scanf("%I64d",&x);
//求下限
if(l>=x) p=l-x;
else if(r>=x) p=((l&)==(x&)?:);
else p=x-r; //求上限
if(r+x<=m) q=r+x;
else if(l+x<=m) q=(((l+x)&)==(m&)?m:m-);
else q=*m-(l+x); l=p;
r=q;
}
ll ans=;
for(int i=l;i<=r;i+=)
{
ans=ans+work(m,i);
ans%=MOD;
}
printf("%I64d\n",ans);
}
return ;
}

附上大神的代码:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define mod 1000000009
#define LL __int64
#define maxn 100000+5 LL f[maxn]; void set()
{
int i;
f[] = ;
for(i = ; i<maxn; i++)
f[i] = (f[i-]*i)%mod;
} LL quickmod(LL a,LL b)
{
LL ans = ;
while(b)
{
if(b&)
{
ans = (ans*a)%mod;
b--;
}
b/=;
a = ((a%mod)*(a%mod))%mod;
}
return ans;
} int main()
{
int n,m,i,j,k,l,r,x,ll,rr;
set();
while(~scanf("%d%d",&n,&m))
{
l = r = ;
for(i = ; i<n; i++)
{
scanf("%d",&x);
//计算最小的1的个数,尽可能多的让1->0
if(l>=x) ll = l-x;//当最小的1个数大于x,把x个1全部翻转
else if(r>=x) ll = ((l%)==(x%))?:;//当l<x<=r,由于无论怎么翻,其奇偶性必定相等,所以看l的奇偶性与x是否相同,相同那么知道最小必定变为0,否则变为1
else ll = x-r;//当x>r,那么在把1全部变为0的同时,还有x-r个0变为1
//计算最大的1的个数,尽可能多的让0->1
if(r+x<=m) rr = r+x;//当r+x<=m的情况下,全部变为1
else if(l+x<=m) rr = (((l+x)%) == (m%)?m:m-);//在r+x>m但是l+x<=m的情况下,也是判断奇偶,同态那么必定在中间有一种能全部变为1,否则至少有一张必定为0
else rr = *m-(l+x);//在l+x>m的情况下,等于我首先把m个1变为了0,那么我还要翻(l+x-m)张,所以最终得到m-(l+x-m)个1 l = ll,r = rr;
}
LL sum = ;
for(i = l; i<=r; i+=)//使用费马小定理和快速幂的方法求和
sum+=((f[m]%mod)*(quickmod((f[i]*f[m-i])%mod,mod-)%mod))%mod;
printf("%I64d\n",sum%mod);
} return ;
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,023
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,513
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,360
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,143
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,774
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,852