很经典的矩阵快速幂,这个题也可以求循环节
#include <cstring>
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int mod=1000000007;
ll s[2][2]= {1,0,0,1};//用来储存结果的常数矩阵
ll x,y,n;
void multi(ll a[][2],ll b[][2])
{
ll c[2][2];
memset(c,0,sizeof(c));
for(int k=0; k<2; k++)
for(int i=0; i<2; i++)
for(int j=0; j<2; j++)
c[i][j]=((c[i][j]+a[i][k]*b[k][j])%mod+mod)%mod;
memcpy(a,c,sizeof(c));
}
void quick_pow(int n)
{
ll T[2][2]= {1,-1,1,0};//T*A(n-1)=A(n)的T矩阵
while(n)
{
if(n&1) multi(s,T);
multi(T,T);
n>>=1;
}
}
int main()
{
scanf("%lld%lld%lld",&x,&y,&n);
if(n==1) printf("%lld\n",(x%mod+mod)%mod);
else if(n==2) printf("%lld\n",(y%mod+mod)%mod);
else
{
quick_pow(n-2);//求f(3)只需要用一次T矩阵,所以是n-2
printf("%lld\n",((y*s[0][0]%mod+x*s[0][1]%mod)%mod+mod)%mod);
//这里我喜欢用前边的项推后面的,所以递推式是f(n)=f(n-1)-f(n-2)
}
return 0;
}