题目描述
一个数列定义如下:f(1)=1,f(2)=1,f(n)=(A*f(n-1)+B*f(n-2))mod 7。给定A,B和n的值,要求计算f(n)的值。
数据范围
100%的数据,n≤100,000,000
样例输入
1 1 3
样例输出
2
解题思路
矩阵快速幂。
X=[AB10]Y=[11]Ans=Xk−2∗Y
答案就是Ans[1][1]
代码
#include <bits/stdc++.h>
using namespace std;
inline int Getint(){int x=0,f=1;char ch=getchar();while('0'>ch||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
int Map[3][3],a[3][3],b[3][3];
void Cheng(int C[][3],int D[][3]){
int e[3][3];
memset(e,0,sizeof(e));
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
e[i][j]+=C[i][k]*D[k][j];
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
C[i][j]=e[i][j]%7;
}
void ksm(int k){
if(k==1){
memcpy(a,b,sizeof(b));
return;
}
if(k&1){
ksm(k-1);
Cheng(a,b);
}else{
ksm(k/2);
Cheng(a,a);
}
}
int main(){
int A=Getint(),B=Getint(),k=Getint();
memset(Map,0,sizeof(Map));
if(k<=2){cout<<1;return 0;}
Map[1][1]=1;
Map[2][1]=1;
b[1][1]=A%7;
b[2][1]=B%7;
b[1][2]=1;
b[2][2]=0;
ksm(k-2);
cout<<(a[1][1]+a[2][1])%7<<"\n";
return 0;
}