问题描述
一个数字序列定义如下:
f(1)= 1,f(2)= 1,f(n)=(A * f(n-1)+ B * f(n-2))mod 7.
给定A,B和n,您将要计算f(n)的值。
输入值
输入包含多个测试用例。每个测试用例在一行上包含3个整数A,B和n(1 <= A,B <= 1000、1 <= n <= 100,000,000)。三个零表示输入结束,该测试用例将不被处理。
输出量
对于每个测试用例,将f(n)的值打印在一行上。
样本输入
1 1 3
1 2 10
0 0 0
样本输出
2
5
#include<bits/stdc++.h>
using namespace std;
//快速幂矩阵,简单讲就是 定义矩阵,矩阵乘法,快速幂算法
//第一步:用结构体来存一个矩阵
struct matrix{
int m[2][2];
/*matrix(){
memset(m,0,sizeof(m));
} 初始化为0 */
};
//第二步:矩阵乘法
/*矩阵乘法这里,最重要的时自己算出 中间矩阵 ,从而将矩阵
和斐波那契数列联系起来 */
matrix mul(matrix a,matrix b)
{
matrix ans;
/*需要用三重循环来运算矩阵乘法
乘完还是一个矩阵 */
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
ans.m[i][j]=0;
for(int k=0;k<2;k++){
ans.m[i][j]=(ans.m[i][j]+(a.m[i][k]*b.m[k][j])%7)%7;
}
}
}
return ans;
}
int main()
{
int A,B,n;
while(~scanf("%d%d%d",&A,&B,&n)){
if(A==0&&B==0&&n==0)
break;
//n<=2时需要特殊说明
if(n<=2){
printf("1\n");
continue;
}
matrix a,ans;//定义一个单位矩阵ans,和关系矩阵a;
//关系矩阵 对应系数
a.m[0][0]=A;
a.m[0][1]=B;
a.m[1][0]=1;
a.m[1][1]=0;
//初始化为单位矩阵
ans.m[0][0]=ans.m[1][1]=1;
ans.m[0][1]=ans.m[1][0]=0;
n=n-2;
//快速幂
while(n){
if(n%2==1){
ans=mul(ans,a);
}
n/=2;
a=mul(a,a);
}
printf("%d\n",(ans.m[0][0]+ans.m[0][1])%7);
}
return 0;
}