2016
Given a 2×2 matrix
A=(a11a21a12a22),
find An where A1=A,An=A×An−1. As the result may be large, you are going to find only the remainder after division by 7.
Special Note: The problem is intended to be easy. Feel free to think why the problem is called 2016 if you either:
find it hard to solve;
or, solved all the other problems easily.
Input
The input contains at most 40 sets. For each set:
The first line contains an integer n (1≤n<10100000).
The second line contains 2 integers a11,a12.
The third line contains 2 integers a21,a22.
(0≤aij<7, (a11a22−a12a21) is not a multiple of 7)
Output
For each set, a 2×2 matrix denotes the remainder of An after division by 7.
Sample Input
2
1 1
1 2
2016
1 1
1 2
Sample Output
2 3
3 5
1 0
0 1
分析:不要被它的n吓到了,用大数取余就好了,其他的就是快速幂了!
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<cstdio>
using namespace std;
char s[100005];
#define N 7
struct r
{
long long int m[2][2];
}ans, tmp;
r multi(r a,r b)
{
r cnt;
cnt.m[0][0]=(a.m[0][0]*b.m[0][0]+a.m[0][1]*b.m[1][0])%N;
cnt.m[0][1]=(a.m[0][0]*b.m[0][1]+a.m[0][1]*b.m[1][1])%N;
cnt.m[1][0]=(a.m[1][0]*b.m[0][0]+a.m[1][1]*b.m[1][0])%N;
cnt.m[1][1]=(a.m[1][0]*b.m[0][1]+a.m[1][1]*b.m[1][1])%N;
return cnt;
}
void Matrix_power(int n)
{
tmp.m[0][0]=tmp.m[1][1] =1;
tmp.m[0][1]=tmp.m[1][0]=0;
while(n)
{
if(n&1)
tmp=multi(tmp,ans);
ans=multi(ans,ans);
n>>=1;
}
cout<<tmp.m[0][0]<<" "<<tmp.m[0][1]<<endl<<tmp.m[1][0]<<" "<<tmp.m[1][1]<<endl;
}
int main()
{
while(cin>>s)
{
scanf("%lld%lld%lld%lld",&ans.m[0][0],&ans.m[0][1],&ans.m[1][0],&ans.m[1][1]);
int mod=0,len=strlen(s);
for(int i=0;i<len;i++)
{
mod=mod*10+s[i]-'0';
mod%=2016;
}
if(mod==0)
{
cout<<"1 0"<<endl<<"0 1"<<endl;
}
else
Matrix_power(mod);
}
return 0;
}