有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
给出A,B和N,求f(n)的值。
Input
输入3个数:A,B,N。数字之间用空格分割。(-10000 <= A, B <= 10000, 1 <= N <= 10^9)
Output
输出f(n)的值。
Input示例
3 -1 5
Output示例
6
方法:矩阵快速幂
#include<iostream>
#define N 2
using namespace std;
struct node{
long long matrix[N][N];
};
const int mod=7;
struct node mult(node x,node y)
{
struct node res;
res.matrix[0][0]=0;
res.matrix[0][1]=0;
res.matrix[1][0]=0;
res.matrix[1][1]=0;
int i,j,k;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
for(k=0;k<N;k++)
res.matrix[i][j]+=(x.matrix[i][k]*y.matrix[k][j]+mod)%mod;
}
}
return res;
}
long long pow(int A,int B,int n)
{
struct node ans;
ans.matrix[0][0]=1;
ans.matrix[0][1]=0;
ans.matrix[1][0]=0;
ans.matrix[1][1]=1;
struct node base;
base.matrix[0][0]=A;
base.matrix[0][1]=B;
base.matrix[1][0]=1;
base.matrix[1][1]=0;
while(n>0)
{
if(n&1)
ans=mult(ans,base);
base=mult(base,base);
n>>=1;
}
return (ans.matrix[0][0]+ans.matrix[0][1])%mod;
}
int main()
{
int A,B,n;
cin>>A>>B>>n;
long long ans=pow(A,B,n-2);
cout<<ans<<endl;
return 0;
}