#include <cstdio>
#include <cstring>
#include <cmath>
#include <climits>
#include <algorithm>
using namespace std;
const long long mod=(long long)(1e9+7);
const int MAX_SIZE=10;
struct Matrix{
int row,col;
long long data[MAX_SIZE][MAX_SIZE];
};
inline Matrix Multiply(Matrix a,Matrix b)//矩阵a和b可相乘的充要条件:a的列数==b的行数
{//矩阵相乘的结果矩阵的行数是a的行数,列数是b的列数
Matrix ans;
ans.row=a.row,ans.col=b.col;
memset(ans.data,0,sizeof(ans.data));
for(int i=1;i<=ans.row;i++){
for(int j=1;j<=ans.col;j++){
for(int k=1;k<=a.col;k++){//a.col==b.row
ans.data[i][j]+=a.data[i][k]*b.data[k][j];
ans.data[i][j]%=mod;
}
}
}
return ans;
}
inline Matrix quick_power(Matrix a,long long n)
{
Matrix ans,tmp=a;
ans.row=ans.col=a.row;
for(int i=1;i<=ans.row;i++) { ans.data[i][i]=1; }
while(n){
if(n&1) ans=Multiply(ans,tmp);
tmp=Multiply(tmp,tmp);
n>>=1;
}
return ans;
}
// 定义:f(n)=f(n-1)-f(n-2),n>=3.
// 输入f1和f2,以及n,输出f(n)%(1e9+7)值。数据long long.
int main()
{
long long a,b,n;
while(~scanf("%I64d %I64d",&a,&b)){
scanf("%I64d",&n);
if(n==1){
printf("%I64d\n",(a+mod)%mod);
continue;
}else if(n==2){
printf("%I64d\n",(b+mod)%mod);
continue;
}
Matrix tmp,ans;
tmp.row=tmp.col=2;
tmp.data[1][1]=0;
tmp.data[1][2]=-1;
tmp.data[2][1]=tmp.data[2][2]=1;
ans=quick_power(tmp,n-2);
printf("%I64d\n",((a*ans.data[1][2]+b*ans.data[2][2])%mod+mod)%mod);
}
}
模版--矩阵快速幂
最新推荐文章于 2022-08-27 21:03:02 发布