思路:
移项得到Fn=Fn-1-Fn-2
构造矩阵
1 -1
1 0
注意long long 取模 和n=1和2的情况
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
#define ll long long
#define max_ 10010
#define mod 1000000007
#define inf 0x3f3f3f3f
struct mat
{
ll num[5][5];
mat()
{
memset(num,0,sizeof num);
}
};
ll n,x,y;
mat mul(mat a,mat b)
{
mat ans;
for(int i=1;i<=2;i++)
{
for(int j=1;j<=2;j++)
{
for(int k=1;k<=2;k++)
{
ans.num[i][j]+=a.num[i][k]*b.num[k][j]%mod;
ans.num[i][j]%=mod;
}
}
}
return ans;
}
ll fpow(mat a,ll b)
{
mat ans,tmp=a;
ans.num[1][1]=ans.num[2][2]=1;
while(b)
{
if(b&1)
ans=mul(ans,tmp);
tmp=mul(tmp,tmp);
b/=2;
}
return (((ans.num[1][1]*y%mod+ans.num[1][2]*x%mod)%mod+mod)%mod);
}
int main(int argc, char const *argv[]) {
mat a;
a.num[1][1]=1;
a.num[1][2]=-1;
a.num[2][1]=1;
a.num[2][2]=0;
scanf("%lld%lld",&x,&y);
scanf("%lld",&n);
if(n==1)
printf("%lld\n",(x+mod)%mod );
else if(n==2)
printf("%lld\n",(y+mod)%mod );
else
printf("%lld\n",fpow(a,n-2));
return 0;
}