标签:des c style class blog code
Time Limit: 2000/1000 MS
(Java/Others) Memory Limit: 32768/32768 K
(Java/Others)
Total Submission(s): 2026 Accepted
Submission(s): 624
1 #include<iostream> 2 #include<stdio.h> 3 #include<cstring> 4 #include<cstdlib> 5 using namespace std; 6 typedef __int64 LL; 7 8 LL p ; 9 struct Matrix 10 { 11 LL mat[3][3]; 12 void init() 13 { 14 mat[1][1]=1;mat[1][2]=0; 15 mat[2][1]=0;mat[2][2]=1; 16 } 17 void mem(LL a,LL b) 18 { 19 mat[1][1]=(2*a)%p; mat[1][2]=(b-a*a)%p; 20 mat[2][1]=1; mat[2][2]=0; 21 } 22 }; 23 Matrix multiply(Matrix cur,Matrix ans) 24 { 25 Matrix now; 26 memset(now.mat,0,sizeof(now.mat)); 27 int i,j,k; 28 for(i=1;i<=2;i++) 29 { 30 for(k=1;k<=2;k++) 31 { 32 for(j=1;j<=2;j++) 33 { 34 now.mat[i][j]+=cur.mat[i][k]*ans.mat[k][j]; 35 now.mat[i][j]%=p; 36 while(now.mat[i][j]<0) now.mat[i][j]+=p; 37 } 38 } 39 } 40 return now; 41 } 42 void pow_mod(Matrix cur,LL n,LL a,LL b) 43 { 44 Matrix ans; 45 ans.init(); 46 while(n) 47 { 48 if(n&1) ans=multiply(ans,cur); 49 n=n>>1; 50 cur=multiply(cur,cur); 51 } 52 LL sum=(ans.mat[1][1]*2*a+ans.mat[1][2]*2)%p; 53 printf("%I64d\n",sum); 54 } 55 int main() 56 { 57 LL a,b,n; 58 while(scanf("%I64d%I64d%I64d%I64d",&a,&b,&n,&p)>0) 59 { 60 Matrix hxl; 61 hxl.mem(a,b); 62 if(n>1) 63 pow_mod(hxl,n-1,a,b); 64 else printf("%I64d\n",(2*a)%p); 65 } 66 return 0; 67 }
标签:des c style class blog code
原文地址:http://www.cnblogs.com/tom987690183/p/3757901.html