首页 > 代码库 > HDU 4869 Turn the pokers
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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。