代码改变世界

求递推序列的第N项(斐波那契数列 数论 模拟 矩阵快速幂 打表 1126)

2019-08-02 09:52  木木王韦  阅读(141)  评论(0)    收藏  举报

标题求递推序列的第N项

有一个序列是这样定义的: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。数字之间用空格分割。(-10000 <= A, B <= 10000, 1 <= N <= 10^9)
输出
输出f(n)的值。
输入样例
3 -1 5
输出样例
6

ac代码:

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;

int f=2;
int mod=7;
struct node{
	int m[11][11];
};
node mul(node a,node b){
	node ans;
	memset(ans.m ,0,sizeof(ans.m ));
	for(int i=1;i<=f;i++){
		for(int j=1;j<=f;j++){
			for(int k=1;k<=f;k++){
				ans.m[i][j] =(ans.m[i][j] +a.m[i][k]*b.m[k][j]%mod)%mod;
			}
		}
	}
	return ans;
}

node ksm(node a,long int b){
	node res;
	memset(res.m ,0,sizeof(res.m ));
	for(int i=1;i<=f;i++){
		res.m [i][i]=1;
	}
	
	while(b){
		if(b&1){
			
			res=mul(a,res);
			/*for(int i=1;i<=f;i++){
			for(int j=1;j<=f;j++){
				cout<<bb.m [i][j]<<" ";
			}
			cout<<endl;
		}*/
		}
		
		b>>=1;
		a=mul(a,a);
		/*for(int i=1;i<=f;i++){
			for(int j=1;j<=f;j++){
				cout<<a.m [i][j]<<" ";
			}
			cout<<"****"<<endl;
		}*/
	}
	return res;
}

int main(){
	
	long int A,B,n,b;
	
	
	while(cin>>A>>B>>n){
		if(n<=2){
			cout<<"1"<<endl;
		}
		else{
			if(A<0) A+=7;
			if(B<0) B+=7;
		node a,b1,b2;
		a.m [1][1]=1;
		a.m [1][2]=0;
		a.m [2][1]=1;
		a.m [2][2]=0;
		
		b1.m [1][1]=A;
		b1.m [1][2]=B;
		b1.m [2][1]=1;
		b1.m [2][2]=0;
		
	/*	for(int i=1;i<=f;i++){
			for(int j=1;j<=f;j++){
				cout<<b1.m [i][j]<<" ";
			}
			cout<<"%%%"<<endl;
		}*/
		b2=ksm(b1,n-2);
		b2=mul(b2,a);
		
		/*for(int i=1;i<=f;i++){
			cout<<b2.m [i][1]<<endl;
		}*/
		cout<<(b2.m [1][1]+mod)%mod<<endl;
	}
		}
		
	return 0;
}