f1 = x, f2 = y;
fi = f(i-1) + f(i+1)
fi = f(i-1)-f(i-2);
类似于斐波那契构造矩阵
| 1 -1 |
| 1 0 |
代码:
#include
using namespace std;
const int mod = 1000000007;
struct node
{
int s[2][2];
node() {}
node(int a, int b, int c, int d)
{
s[0][0] = a;
s[0][1] = b;
s[1][0] = c;
s[1][1] = d;
}
};
node mul(node a, node b)
{
node t = node(0, 0, 0, 0);
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++)
for(int k = 0; k < 2; k++)
t.s[i][j] = (t.s[i][j]+a.s[i][k]*b.s[k][j])%mod;
return t;
}
node mt_pow(node p, int n)
{
node q = node(1, 0, 0, 1);
while(n)
{
if(n&1) q = mul(q, p);
p = mul(p, p);
n /= 2;
}
return q;
}
int main(void)
{
int f1, f2, n;
while(cin >> f1 >> f2 >> n)
{
if(n == 1) printf("%d\n", (f1%mod+mod)%mod);
else if(n == 2) printf("%d\n", (f2%mod+mod)%mod);
else
{
node base = node(1, -1, 1, 0);
node ans = mt_pow(base, n-2);
int res = (ans.s[0][0]*f2+ans.s[0][1]*f1)%mod;
if(res < 0) res += mod;
printf("%d\n", res);
}
}
return 0;
}
Description
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).
Sample Input
2 3 3
1
0 -1 2
1000000006
Hint
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).