2016
Given a 2×2
matrix
find
A
n![]()
![]()
where
A
1
=A,A
n
=A×A
n−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<10
100000![]()
).
The second line contains 2
integers a
11
,a
12![]()
.
The third line contains 2
integers a
21
,a
22![]()
.
(0≤a
ij
<7
,
(a
11
a
22
−a
12
a
21
)
is not a multiple of 7
)
Output
For each set, a 2×2
matrix denotes the remainder of A
n![]()
after division by 7
.
Sample Input
Sample Output
2 3
3 5
1 0
0 1
题目的这句话Feel free to think why the problem is called 2016
if you either:可以猜到循环节是2016
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
char x[100005];
int main()
{
int n;
while(~scanf("%s",x))
{
n=0;
int t=strlen(x);
for(int i=0;i<t;i++)
{
n=(n*10+x[i]-'0')%2016;
}
//printf("%d\n",n);
int a,b,c,d;
cin>>a>>b>>c>>d;
int a1,b1,c1,d1;
a1=a;
b1=b;
c1=c;
d1=d;
for(int i=1;i<n;i++)
{
int a2=a1;
int b2=b1;
int c2=c1;
int d2=d1;
a1=(a*a2+b*c2)%7;
b1=(a*b2+b*d2)%7;
c1=(c*a2+d*c2)%7;
d1=(c*b2+d*d2)%7;
}
if(n==0)
{
a1=1;
b1=0;
c1=0;
d1=1;
}
cout<<a1<<" "<<b1<<endl<<c1<<" "<<d1<<endl;
}
return 0;
}