快速幂
Raising Modulo Numbers http://poj.org/problem?id=1995
快速幂取模
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 typedef __int64 LL; 3 LL quickpow(LL a,LL b,LL c){//快速幂求(a^b)%c 4 LL ret=1%c; 5 for(;b;a=a*a%c,b>>=1){ 6 if(b&1){ 7 ret=ret*a%c; 8 } 9 } 10 return ret; 11 } 12 int main(){ 13 int t,n; 14 LL mod,a,b; 15 while(~scanf("%d",&t)){ 16 while(t--){ 17 scanf("%I64d%d",&mod,&n); 18 LL sum=0; 19 while(n--){ 20 scanf("%I64d%I64d",&a,&b); 21 sum+=quickpow(a,b,mod); 22 sum%=mod; 23 } 24 printf("%I64d\n",sum); 25 } 26 } 27 }
Turn the pokers http://acm.hdu.edu.cn/showproblem.php?pid=4869
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 typedef __int64 LL; 5 const int M=100010; 6 const int mod=1000000009; 7 LL quickpow(LL a,LL b,LL c){//快速幂求(a^b)%c 8 LL ret=1%c; 9 for(;b;a=a*a%c,b>>=1){ 10 if(b&1){ 11 ret=ret*a%c; 12 } 13 } 14 return ret; 15 } 16 LL C[M]; 17 LL INV[M]; 18 int main() { 19 for(int i=1; i<M; i++) { 20 INV[i]=quickpow(i,mod-2,mod); 21 } 22 int n,m,a; 23 while(~scanf("%d%d",&n,&m)) { 24 C[0]=1; 25 for(int i=1;i<=m;i++){ 26 C[i]=C[i-1]*(m-i+1)%mod*INV[i]%mod; 27 } 28 int L=0,R=0,nl,nr,tmp; 29 for(int i=0;i<n;i++){ 30 scanf("%d",&a); 31 tmp=min(m-L,a); 32 nr=L+tmp-(a-tmp); 33 tmp=min(R,a); 34 nl=R-tmp+(a-tmp); 35 if(nl>nr) swap(nl,nr); 36 if(L<=a&&a<=R){ 37 if(L%2==a%2){ 38 nl=0; 39 } 40 else{ 41 nl=min(nl,1); 42 } 43 } 44 if((m-R)<=a&&a<=(m-L)){ 45 if((m-L)%2==a%2){ 46 nr=m; 47 } 48 else{ 49 nr=max(nr,m-1); 50 } 51 } 52 if(L>=a) nl=min(nl,L-a); 53 if(m-R>=a) nr=max(nr,R+a); 54 L=nl; 55 R=nr; 56 } 57 int ans=0; 58 for(int i=L;i<=R;i+=2){ 59 ans+=C[i]; 60 ans%=mod; 61 } 62 printf("%d\n",ans); 63 } 64 return 0; 65 }
end