2016
Accepted : 116 | Submit : 435 | |
Time Limit : 2000 MS | Memory Limit : 65536 KB |
2016
Given a 2×2 matrix
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%2016就可以了,然后就是快速幂的方法原理。。。好气啊,之前用scanf输入忘记处理空格了就是过不去,加上getchar救过了。如果用的cin输入,那么久不用考虑了。。。
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <cstring>
using namespace std;
struct P{
int c[2][2];
}a,b;
P fun(P a,P b)///矩阵乘法
{
P cnt;
cnt.c[0][0]=(a.c[0][0]*b.c[0][0]+a.c[0][1]*b.c[1][0])%7;
cnt.c[0][1]=(a.c[0][0]*b.c[0][1]+a.c[0][1]*b.c[1][1])%7;
cnt.c[1][0]=(a.c[1][0]*b.c[0][0]+a.c[1][1]*b.c[1][0])%7;
cnt.c[1][1]=(a.c[1][0]*b.c[0][1]+a.c[1][1]*b.c[1][1])%7;
return cnt;
}
void f(int n)///快速幂
{
b.c[0][0]=b.c[1][1] =1;
b.c[0][1]=b.c[1][0]=0;
while(n)
{
if(n&1) b=fun(b,a);
a=fun(a,a);
n>>=1;
}
printf("%d %d\n%d %d\n",b.c[0][0],b.c[0][1],b.c[1][0],b.c[1][1]);
}
int main()
{
char s[100011];
while(scanf("%s",s)!=EOF)
{
scanf("%d %d",&a.c[0][0],&a.c[0][1]);
scanf("%d %d",&a.c[1][0],&a.c[1][1]);
int l=strlen(s),ss=0;
for(int i=0;i<l;i++)///取模
ss=(ss*10+s[i]-'0')%2016;
if(ss==0)printf("1 0\n0 1\n");
else f(ss);
getchar();
}
return 0;
}