3 4 3 2 3 3 3 3 2 3
8 3HintFor 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)
题解:官方给出的题解看了半天看懂了一部分,后来看了别人的博客,讲的挺详细但是有的地方还是很难懂,和朋友讨论了半天终于弄懂了所有的细节。
首先,我们把牌的正反面的情况规定成0,1的情况(0反,1正),进行m次操作,共翻转s=sum(x0+x1+....+xm-1)次,最后出现1的数目必然和s同奇同偶(s为奇数,1的个数就为奇数,反之为偶数)----每翻转一张牌(把1翻转成0,0翻转成1),1的个数都发生奇偶变化,开始时没翻转,也就是0次翻转,1的个数为偶数,翻转1次变奇数,再翻转一次变偶数.....依次类推,以上得证。
那么这样我们就能找出最后1的个数的最小数目l和最大数目r(l,r与s同奇偶),中间过程中我们把某两次从0翻转成1的情况拿出来,翻转同一张牌(相当于相互抵销),那我们最后1的个数就会多2或少2,这样我们最后1的个数就是l,l+2,.....,r-2,r的等差数列,然后用求出c(m,i)的和就可以了。所以主要任务就是求出l和r。代码中有注释详解。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef __int64 LL;
static const int mod = 1000000009;
LL quick_mod(LL a,LL b)
{
LL t=1;
while(b)
{
if(b&1) t=t*a%mod;
b/=2;
a=a*a%mod;
}
return t;
}
int main()
{
LL m,n,x;
while(cin>>m>>n)
{
LL l=0,r=0,p=0,q=0;
//l用来记录前一状态1的最小数,r为最大数
//p用来记录当前状态1的最小数,q为最大数
for(LL i=0;i<m;i++)
{
cin>>x;
//求取最少1的数目,有1翻1
if(l-x>=0) p=l-x; //1)当前状态1的最少数目为l,挑选x张牌翻转,
// 当l>=x,也就是说我能把其中任意x张1翻转成0
else if(r-x>=0) p=(r-x)%2; //2)x>l&&x<=r,由于当前状态1的个数最大为r,最小为l,
//其次我可以通过前面的情况构造[l,r]中与l同奇偶数
//所以我只要构造出与x离得最近的那个就可以使得p只需i小
else p=x-r; //3)x大于当前状态1的最大数目,也就是我除了把这r个1翻转成0
//还需要把x-r个0翻转成1,最小数目为x-r
//求取最多1的数目,有0翻0
if(r+x<=n) q=r+x; //与上面相似,不再赘述
else if(l+x<=n) q=n-((n-l)%2!=x%2);
else q=2*n-(l+x);
l=p,r=q;
}
LL c[100010],ans=0; //使用c数组记录c(m,i)%mod
c[0]=1;
if(l==0) ans+=1;
for(LL i=1;i<=r;i++)
{
if(n-i<i) c[i]=c[n-i];
else c[i]=c[i-1]*(n-i+1)%mod*quick_mod(i,mod-2)%mod;
//这里使用了c(m,i)=c(m,i-1)*(m-i+1)/i的求法
//由于过程中需要取余,所以不能直接用公式计算
//当除以一个数k同时对p取余时,可以把除法转化成乘以这个数k对于p的逆元来计算
//k对于p的逆元的求法就是k*x≡1(mod)p,所有满足上述条件的x都是一个逆元
//由于p是素数,根据费马小定理k^(p-1)≡1(mod)p
//这里进行一下分解k*k^(p-2)≡1(mod)p,可看出k^(p-2)是k对于p的一个逆元
if((l%2==i%2)&&i>=l) ans=(ans+c[i])%mod;
}
cout<<ans<<endl;
}
return 0;
}
hdu 4869 Turn the pokers,布布扣,bubuko.com
原文:http://blog.csdn.net/knight_kaka/article/details/38068929