HDU 4869 Turn the pokers
Posted BBBob
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 4869 Turn the pokers相关的知识,希望对你有一定的参考价值。
/* HDU4869 http://acm.hdu.edu.cn/showproblem.php?pid=4869 费马小定理+快速幂 求逆元 暴力组合数 奇偶性 */ #include <cstdio> #include <algorithm> using namespace std; const __int64 Nmax=100005LL; const __int64 mod=1000000009LL; __int64 fac[Nmax];//i! __int64 l,r,n,m; void get() { fac[0]=fac[1]=1LL; for(__int64 i=2LL;i<=Nmax-1;i++) fac[i]=(fac[i-1]*(i%mod))%mod; } __int64 pow(__int64 base,__int64 n) { __int64 ans=1LL; base=base%mod; while(n>0LL) { if(n&1LL) ans=(ans*base)%mod; base=(base*base)%mod; n>>=1; } return ans; } __int64 C(__int64 n,__int64 m) { __int64 ans=1LL; ans=fac[n]%mod; ans=(ans* (pow(fac[m]*fac[n-m],mod-2)%mod) )%mod; // ans=(ans* (pow(fac[m],mod-2)%mod))%mod; // ans=(ans* (pow(fac[n-m],mod-2)%mod))%mod; return ans; } void get_limit() { l=r=0LL; int x; for(int i=1;i<=m;i++) { scanf("%d",&x); __int64 ll,rr; //1->0 if(x<=l)// x l r ll=l-x; else if(x<=r)// l x r { if((x&1)==(l&1)) ll=0; else ll=1; } else// l r x ll=x-r; //0->1 if(r+x<=n) rr= r+x;// else if(l+x<=n) { if(((l+x)&1) == (n&1)) rr=n; else rr=n-1; } else rr = 2*n-(l+x);// l=ll,r=rr; } } int main() { //freopen("HDU4869.in","r",stdin); get(); while(scanf("%I64d%I64d",&m,&n)==2) { get_limit(); __int64 ans=0LL; // printf("%d %d\n",l,r); for(__int64 i=l;i<=r;i+=2) { ans=(ans+C(n,i)%mod); // printf("C(%I64d,%d)=%I64d\n",n,i,C(n,i)); } ans%=mod; while(ans<0) ans+=mod; printf("%I64d\n",ans); } return 0; }
以上是关于HDU 4869 Turn the pokers的主要内容,如果未能解决你的问题,请参考以下文章
HDU4869:Turn the pokers(费马小定理+高速幂)
HDU 4869 Turn the pokers(思维+逆元)
HDU 4869 Turn The Pokers 思维+组合