Number Sequence

在这里插入图片描述
Sample Input
1 1 3
1 2 10
0 0 0
Sample Output
2
5

#include<iostream>
using namespace std;
#define int long long
const int mod = 7;
struct Matrix{
	static const int n = 3;//静态变量n,比给定的矩阵大1就可以 
	int temp[n][n];//临时数组,存放结果
	Matrix(int e = 0){//构造函数初始化作用 
		for(int i=1;i<=n-1;i++){
			for(int j=1;j<=n-1;j++){
				temp[i][j]=(i==j)*e;
				//i=j结果只能是1,行和列相等
				//等于1 的话乘e就好 
			}
		} 
	} 
	//矩阵乘法 
	Matrix mul(Matrix A,Matrix B){
		Matrix ans(0);
		for(int i=1;i<=n-1;i++){
			for(int j=1;j<=n-1;j++){
				for(int k=1;k<=n-1;k++){
					ans.temp[i][j]=(ans.temp[i][j]%mod+((A.temp[i][k]%mod)*(B.temp[k][j]%mod)%mod))%mod;
				}
			}
		}
		return ans;
//		A[1][2]*B[2][1]
//			 k
	}
	Matrix qpow(Matrix A,int b){
		Matrix res(1);
		while(b){
			if(b&1)
				res=res.mul(res,A);
			b>>=1;
			A=A.mul(A,A);
		}
		return res;
	}
}; 
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	int a,b,nn;
	while(cin>>a>>b>>nn){
		if(a==b&&b==nn&&a==0)
			break;
		if(nn<=2){
			cout<<1<<endl;
			continue;
		} 
		Matrix A(0);
		A.temp[1][1]=a;
		A.temp[1][2]=b;
		A.temp[2][1]=1;//构造固定矩阵
		 
		A=A.qpow(A,nn-2);//求A 的n-2次幂,结果放到A中 
		
		//利用A^(n-2) 求结果f(n) 
		int ans = 0;
		int dat[3]={0,1,1};
		for(int i=1;i<=2;i++){
			ans = (ans%mod+((A.temp[1][i]%mod*dat[i]%mod)%mod)%mod)%mod;
		} 
		cout<<ans<<endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值