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
Copy
2 3 3
output
Copy
1
input
Copy
0 -1 2
output
Copy
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).
题意:定义一个序列fn,f[1]=x,f[2]=y,f[n]=f[n-1]-f[n-2](n>2),求这个序列的第n(n<=1e9)项mod1e9+7。
思路:明显是类似于斐波那契数列的矩阵快速幂。
代码:
#include
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1002;
ll mo=1000000007;
ll n,a,b;
struct node
{
ll n,m,a[7][7];
void init()
{
memset(a,0,sizeof(a));
for(int i=0;i>=1;
a=mul(a,a,a.n,a.n,a.n);
}
return d;
}
ll poww(ll a,ll n)
{
ll sum=1;
while(n)
{
if(n&1) sum=sum*a%mo;
n>>=1;
a=a*a%mo;
}
return sum;
}
int main()
{
int T,cas=1,fg;
while(scanf("%lld%lld%lld",&a,&b,&n)!=EOF)
{
a=(a+mo)%mo;
b=(b+mo)%mo;
if(n==1)
{
printf("%lld\n",a%mo);
continue;
}
else if(n==2)
{
printf("%lld\n",b%mo);
continue;
}
node x;
x.n=2;x.m=2;
memset(x.a,0,sizeof(x.a));
x.a[0][0]=1;
x.a[0][1]=-1;
x.a[1][0]=1;
x.a[1][1]=0;
node ans=power(x,n-2);
node tmp;
tmp.n=2;
tmp.m=1;
memset(tmp.a,0,sizeof(tmp.a));
tmp.a[0][0]=b;
tmp.a[1][0]=a;
ans=mul(ans,tmp,2,2,1);
ll sum=(ans.a[0][0]+mo)%mo;
printf("%lld\n",sum);
}
return 0;
}