矩阵递推关系的建立 and 矩阵快速幂

  • [递推关系的建立]

  • [矩阵快速幂模板]
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
const int N = 2;
struct ma{
	ll a[N][N];
	void init()// 初始化为单位矩阵 
	{
		memset(a,0,sizeof a);
		for(int i=0;i<N;i++) a[i][i] = 1;
	}
};
ma mul(ma a,ma b)// 矩阵相乘 
{	
	ma ans;  
	for(int i=0; i<N; i++)// N:第一个矩阵的行 
	{
		for(int j=0; j<N; j++)// N:第二个矩阵的列 
		{
			ll s = 0;
			for(int k=0; k<N; k++) // N:第二个矩阵的列 
			{
				s = ( s + a.a[i][k]*b.a[k][j]%mod )%mod;
			}
			ans.a[i][j] = s;
		}
	}
	return ans;
}
ma qpow(ma aa,ll bb)// 矩阵快速幂 
{
	ma ans;
	ans.init();
	while( bb )
	{
		if( bb&1 ) ans = mul(ans,aa);
		aa = mul(aa,aa);
		bb >>= 1;
	}
	return ans;
} 

int main()
{
	int n; 
	while( cin>>n )
	{
		ma a;
		a.a[0][0] = a.a[0][1] = a.a[1][0] = 1;
		a.a[1][1] = 0;
		ma ans = qpow(a,n);
		cout<<ans.a[0][0]<<" "<<ans.a[0][1]<<"\n";
		cout<<ans.a[1][0]<<" "<<ans.a[1][1]<<"\n";
	 } 
	 /*
		很容易就可以发现当f[1] = f[2] = 1;
		ans.a[0][0] = f[n+1] 
		ans.a[0][1] = f[n] 
	*/
} 

posted @ 2020-09-02 19:57  特立独行的猪猪  阅读(160)  评论(0编辑  收藏  举报