codeforces 450B B. Jzzhu and Sequences(矩阵快速幂)

题目链接:

B. Jzzhu and Sequences

time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Jzzhu has invented a kind of sequences, they meet the following property:

You are given x and y, please calculate fn modulo 1000000007 (109 + 7).

 

Input

The first line contains two integers x and y (|x|, |y| ≤ 109). The second line contains a single integer n (1 ≤ n ≤ 2·109).

 

Output

Output a single integer representing fn modulo 1000000007 (109 + 7).

 

Examples
 
input
2 3
3
output
1
input
0 -1
2
output
1000000006
Note

In the first sample, f2 = f1 + f3, 3 = 2 + f3, f3 = 1.

In the second sample, f2 =  - 1;  - 1 modulo (10^9 + 7) equals (10^9 + 6).

 

题意:

水题,不行说;

 

思路:

矩阵快速幂的水题;

 

AC代码:

#include <bits/stdc++.h>
using namespace std;
const int N=1e4+6;
typedef long long ll;
const ll mod=1e9+7;
ll n,x,y;
struct matrix
{
    ll a[2][2];
};
matrix mul(matrix A,matrix B)
{
    matrix s;
    s.a[0][0]=s.a[1][1]=0;
    s.a[0][1]=s.a[1][0]=0;
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)
        {
            s.a[i][j]=0;
            for(int k=0;k<2;k++)
            {
                s.a[i][j]+=A.a[i][k]*B.a[k][j];
                s.a[i][j]%=mod;
            }
        }
    }
    return s;
}
ll fast_pow(matrix A,ll num)
{
    matrix s,base;
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)
        {
            s.a[i][j]=(i==j);
            base.a[i][j]=A.a[i][j];
        }
    }

    while(num)
    {
        if(num&1)
        {
            s=mul(s,base);
        }
        base=mul(base,base);
        num=(num>>1);
    }
    return (s.a[0][0]*y%mod+s.a[0][1]*x%mod)%mod;

}

int main()
{
    cin>>x>>y;
    cin>>n;
    matrix ma;
    ma.a[0][0]=ma.a[1][0]=1;
    ma.a[0][1]=-1;
    ma.a[1][1]=0;
    if(n>2)cout<<(fast_pow(ma,n-2)%mod+mod)%mod<<"\n";
    else if(n==2)cout<<(y%mod+mod)%mod<<"\n";
    else cout<<(x%mod+mod)%mod<<"\n";

}

 

 

posted @ 2016-04-19 23:03  LittlePointer  阅读(192)  评论(0编辑  收藏  举报