首先说下这个题目很善良吧,给了我们负数但又给了我们一个只在0,-1,1之间转的循环matrix.
矩阵自乘:1,-1,1,0 ==>0,-1,1,-1==>-1, 1, -1, 0==>0,-1,1,-1.
看到这我就这知道这个数列会循环。
但同时也告述我们,矩阵快速幂的时候,无需取余。再有题目要求的取余方法与计算机的取余方法不一样,只需按传统方法算完后
再按题目的方法算下就行了。
比如(以模13为列):
(-8%13+-7%13)%13=(-15)%13=-2(我们常用的算模的方法)这样我们再按题目要求的方式取余得1;
希望自己以后能注意到这点,也希望有路过的大神能指出其中原因。
思路不说了。
AC code:
#include<iostream>
#include<cstdio>
#define debug(k) cout<<k<<endl
using namespace std;
typedef long long LL;
const LL mod=1000000007;
struct matrix{
int a[2][2];
matrix (){};
matrix(int x,int y,int xx,int yy){
a[0][0]=x,a[0][1]=y,a[1][0]=xx,a[1][1]=yy;
}
};
LL x,y,k;
matrix mul(matrix a,matrix b)
{
matrix ans(0,0,0,0);
for(int i=0;i<=1;++i)
{
for(int j=0;j<=1;++j)
{
for(int g=0;g<=1;++g)
ans.a[i][j]=(ans.a[i][j]+a.a[i][g]*b.a[g][j]);
}
}
return ans;
}
matrix matrix_mul()
{
matrix ans(1,0,0,1),a(1,-1,1,0);
k-=2;
while(k)
{
if(k&1)ans=mul(ans,a);
k>>=1;
a=mul(a,a);
}
return ans;
}
int main()
{
while(cin>>x>>y>>k)
{
if(k==1)printf("%ld\n",(x%mod+mod)%mod);
else if(k==2)printf("%ld\n",(y%mod+mod)%mod);
else
{
matrix ans;
LL re;
ans=matrix_mul();
re=(y*ans.a[0][0]+x*ans.a[0][1])%mod;
printf("%ld\n",(re+mod)%mod);
}
}
}