XTU 1243 2016 (大数取模+快速幂)

2016

 
Accepted : 116 Submit : 435
Time Limit : 2000 MS Memory Limit : 65536 KB

2016

Given a 2×2 matrix

A=(a11a21a12a22),
find An where A1=A,An=A×An1 .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:

  1. find it hard to solve;
  2. 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 ( 1n<10100000 ).

The second line contains 2 integers a11,a12 .

The third line contains 2 integers a21,a22 .

( 0aij<7 , (a11a22a12a21) 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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值