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 (109 + 7) equals (109 + 6).
首先得到公式
然后构造矩阵,用矩阵加速
取模函数需要自己写一下,是数论中的取模。
#include<bits/stdc++.h>
using namespace std;
long long MOD = 1e9 + 7;
long long x, y;
int n;
long long mod(long long num, long long Mod)
{
if(num > 0)
return num % Mod;
if(abs(num) % Mod == 0)
return 0;
return (num + Mod*(abs(num) / Mod + 1));
}
struct Matrix
{
long long A[3][3];
int R, C;
Matrix operator*(Matrix b);
}X, Y, Z;
Matrix Matrix::operator*(Matrix b)
{
Matrix c;
memset(c.A, 0, sizeof(c.A));
for(int i = 1; i <= R; i++)
for(int j = 1; j <= C; j++)
for(int k = 1; k <= C; k++)
c.A[i][j] = mod((c.A[i][j] + mod(A[i][k]*b.A[k][j], MOD)), MOD);
c.R = R;c.C = b.C;
return c;
}
void init()
{
n = n -1;
Z.A[1][1] = x; Z.A[1][2] = y; Z.R = 1; Z.C = 2;
Y.A[1][1] = 1; Y.A[1][2] = 0; Y.A[2][1] = 0; Y.A[2][2] = 1;Y.R = 2; Y.C = 2;
X.A[1][1] = 0; X.A[1][2] = -1; X.A[2][1] = 1; X.A[2][2] = 1;X.R = 2; X.C = 2;
}
void print()
{
while (n)
{
if(n % 2 == 1)
Y = Y * X;
n >>= 1;
X = X * X;
}
Z = Z * Y;
printf("%I64d\n", mod(Z.A[1][1], MOD));
}
int main()
{
while(scanf("%I64d%I64d%d", &x, &y, &n) != EOF)
{
init();
print();
}
return 0;
}