您的位置:首页 > 产品设计 > UI/UE

codeforces 450-B Jzzhu and Sequences 矩阵快速幂

2017-08-10 19:48 489 查看
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 -12


output
1000000006


Note

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

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

矩阵快速幂入门题吧,建立矩阵模型,算出来那个A,然后就可以ac了

ac代码(注意用long long):#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <set>
#define ll long long
using namespace std;
const ll mod=1e9+7;
struct node{

ll a[2][2];

void init(){
a[0][0]=1;
a[0][1]=-1;
a[1][0]=1;
a[1][1]=0;
}

};

node matrixmul(node a,node b){
int i,j,k;

node c;
c.a[0][0]=c.a[0][1]=c.a[1][0]=c.a[1][1]=0;
for(i=0;i<2;i++){
for(j=0;j<2;j++){
for(k=0;k<2;k++){
c.a[i][j]+=(a.a[i][k]*b.a[k][j]);
}
c.a[i][j]%=mod;
}
}

return c;
}

node mul(node s,ll k){

node ans;

//ans.init();
ans.a[0][0]=ans.a[1][1]=1;
ans.a[0][1]=ans.a[1][0]=0;
while(k>=1){
if(k&1)
ans=matrixmul(ans,s);

k>>=1;
s=matrixmul(s,s);
}

return ans;
}

int main()
{
ll x,y,n;

while(~scanf("%lld%lld",&x,&y)){
scanf("%d",&n);
if(n==1){
printf("%lld\n",(x%mod + mod)%mod);
}
else if(n==2){
printf("%lld\n",(y%mod + mod)%mod);
}
else{
node s;
s.init();
s=mul(s, );
printf("%lld\n",(( s.a[0][0]*y+s.a[0][1]*(x) ) % mod+mod) % mod);
}

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: