2016CCPC 中南地区邀请赛 A 矩阵快速幂
A
A^n=A^(n%2016)%7;
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <sstream> 5 #include <string> 6 #include <algorithm> 7 #include <list> 8 #include <map> 9 #include <vector> 10 #include <queue> 11 #include <stack> 12 #include <cmath> 13 #include <cstdlib> 14 // #include <conio.h> 15 using namespace std; 16 #define clc(a,b) memset(a,b,sizeof(a)) 17 #define inf 0x3f3f3f3f 18 const int N=100010; 19 const int MOD = 1e9+7; 20 #define LL long long 21 double const pi = acos(-1); 22 // void fre() { 23 // freopen("in.txt","r",stdin); 24 // } 25 // inline int r() { 26 // int x=0,f=1;char ch=getchar(); 27 // while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();} 28 // while(ch>='0'&&ch<='9') { x=x*10+ch-'0';ch=getchar();}return x*f; 29 // } 30 31 int mod(string s){ 32 int len; 33 int i; 34 int ans=0; 35 len=s.length(); 36 // cout<<s<<endl; 37 for(i=0;i<len;i++) 38 ans=(ans*10+s[i]-'0')%2016; 39 return ans; 40 } 41 42 struct matrix 43 { 44 int m[2][2]; 45 }ans, base; 46 47 matrix multi(matrix a, matrix b) 48 { 49 matrix tmp; 50 for(int i = 0; i < 2; ++i) 51 { 52 for(int j = 0; j < 2; ++j) 53 { 54 tmp.m[i][j] = 0; 55 for(int k = 0; k < 2; ++k) 56 tmp.m[i][j] = (tmp.m[i][j] + a.m[i][k] * b.m[k][j]) % 7; 57 } 58 } 59 return tmp; 60 } 61 62 void fast_mod(int n) 63 { 64 int a,b,c,d; 65 scanf("%d%d%d%d",&a,&b,&c,&d); 66 base.m[0][0] =a; 67 base.m[0][1] =b; 68 base.m[1][0] =c; 69 base.m[1][1] =d; 70 ans.m[0][0] = ans.m[1][1] = 1; 71 ans.m[0][1] = ans.m[1][0] = 0; 72 if(n==0){ 73 printf("1 0\n"); 74 printf("0 1\n"); 75 return; 76 } 77 while(n) 78 { 79 if(n & 1) 80 { 81 ans = multi(ans, base); 82 } 83 base = multi(base, base); 84 n >>= 1; 85 } 86 printf("%d %d\n",ans.m[0][0],ans.m[0][1]); 87 printf("%d %d\n",ans.m[1][0],ans.m[1][1]); 88 return; 89 } 90 91 92 int main(){ 93 // fre(); 94 string s; 95 while(cin>>s){ 96 int n; 97 n=mod(s); 98 // cout<<n<<endl; 99 fast_mod(n); 100 } 101 return 0; 102 }