题目大意:给出一个序列:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.求解该序列。
解题思路:一看就知道类似于斐波那契数列,第一反应是递归求解,在看看数据量是会T的,因此,这里有两种解法,一是找规律,可以发现结果是Mod7的,因此总共有49种可能。第二种是常规解这种大数取模的优化方法就是矩阵快速幂。由之前的斐波那契的矩阵快速幂求解可知,这里主要对构造矩阵的构造。这里不算太难,至直接既可以构造出来。可以简单推一下,具体的详见code。
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1005
code:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MOD = 7;
int n,a,b;
struct matrix{
int m[2][2];
}mat,ans;
matrix multi(matrix c,matrix d){ //矩阵乘法
matrix tmp;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
tmp.m[i][j]=0;
for(int k=0;k<2;k++)
tmp.m[i][j]=(tmp.m[i][j]+c.m[i][k]*d.m[k][j])%MOD;
}
return tmp;
}
matrix fast_mod(int n){ //矩阵快速幂
mat.m[0][0]=a%MOD; //初始化构造矩阵
mat.m[0][1]=b%MOD;
mat.m[1][0]=1;
mat.m[1][1]=0;
ans.m[0][0]=ans.m[1][1]=1; //初始化单位矩阵
ans.m[0][1]=ans.m[1][0]=0;
while(n){
if(n&1) ans=multi(ans,mat);
mat=multi(mat,mat);
n>>=1;
}
return ans;
}
int main(){
while(scanf("%d%d%d",&a,&b,&n)!=EOF && (a||b||n)){
if(n==1 || n==2) {printf("1\n");continue;}
matrix s=fast_mod(n-2);
printf("%d\n",(s.m[0][0]+s.m[0][1])%MOD);
}
return 0;
}