Codeforces Round 450 Div2 B.Jzzhu and Sequences
阿新 • • 發佈:2018-11-30
note meet ont out algorithm prop else if property http
time limit per test
1 second
memory limit per test 256 megabytes
input standard input
output standard output
![](https://codeforces.com/predownloaded/55/53/5553125ed3b40d54293e6c3b9dac2692d9f2a964.png)
B. Jzzhu and Sequences
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 (109?+?7) equals (109?+?6).
題解
使用矩陣快速冪,構造2*2矩陣從左到右從上到下為 1,1,-1,0。代碼如下:
#include <cstdio> #include <iostream> #include <algorithm> #include <string> #include <cstring> #include <cmath> #include <stack> #include <vector> #include <map> #include <set> #include <queue> #include <utility> #define ll long long using namespace std ; const ll MOD = 1e9+7 ; const int maxn = 2 ; struct matrix{ int m[maxn][maxn] ; }mat ; matrix operator *(matrix a , matrix b){ matrix res ; for ( int i = 0 ; i < maxn ; i ++ ){ for ( int j = 0 ; j < maxn ; j ++ ){ ll temp = 0 ; for ( int k = 0 ; k < maxn ; k ++ ){ temp += (a.m[i][k] % MOD * b.m[k][j] % MOD) % MOD ; } res.m[i][j] = temp % MOD ; } } return res ; } void init(){ for ( int i = 0 ; i < maxn ; i ++ ){ mat.m[i][i] = 1 ; } return ; } matrix quick_pow(matrix a, ll n){ matrix ans = mat ; while (n){ if (n & 1){ ans = ans * a ; } a = a * a ; n >>= 1 ; } return ans ; } int main(){ ll x , y , n ; while ( cin >> x >> y >> n ){ if ( n == 1 ){ cout << (x % MOD + MOD) % MOD << endl ; }else if ( n == 2 ){ cout << (y % MOD + MOD) % MOD << endl ; }else{ init() ; matrix temp ; temp.m[0][0] = 1 , temp.m[0][1] = 1 ; temp.m[1][0] = -1 , temp.m[1][1] = 0 ; temp = quick_pow(temp , n - 2) ; matrix ans ; ans.m[0][0] = y , ans.m[0][1] = x ; ans = ans * temp ; cout << (ans.m[0][0] % MOD + MOD) % MOD << endl ; } } return 0 ; }
Codeforces Round 450 Div2 B.Jzzhu and Sequences