矩阵快速幂(斐波拉契数列)

首先附上题目链接:http://poj.org/problem?id=3070

有关矩阵快速幂的基础知识可以参考这篇博客

#include 
#include  
#define maxn 105
#define mod 1234567
#define LL long long
using namespace std;
//定义一个矩阵结构体 
struct maxtrix
{
	LL m[maxn][maxn];
}ans,res;
//矩阵乘法函数,n代表矩阵的大小 
maxtrix mul(maxtrix ma,maxtrix mb,int n)
{
	//初始化结果矩阵 
	maxtrix mid;
	memset(mid.m,0,sizeof(mid.m));
	
	//矩阵乘法 
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=n;j++)
	    for(int k=1;k<=n;k++)
	    mid.m[i][j]+=ma.m[i][k]*mb.m[k][j]%mod;
	return mid;
}
//矩阵快速幂函数 
void quick_power(LL num,int n)
{  
    //初始化因数矩阵 
    memset(res.m,0,sizeof(res.m));
    res.m[1][1]=res.m[1][2]=res.m[2][1]=1;
    
    //初始化结果矩阵为单位矩阵 
	memset(ans.m,0,sizeof(ans.m));
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=n;j++)
	  if(i==j)ans.m[i][j]=1;
	//快速幂计算  
	while(num)
	{
		if(num&1)ans=mul(ans,res,n);	
		res=mul(res,res,n);	
		num=(num>>1);
	}
}
int main()
{
	//递推过程中的第一个矩阵 
	maxtrix fir;fir.m[1][1]=2;fir.m[2][1]=1;
	
	LL n;
	while(cin>>n)
	{
		quick_power(n-3,2);
     	LL rsl=0;
		for(int i=1;i<=1;i++)
	       for(int j=1;j<=2;j++)
	       rsl=(rsl+ans.m[i][j]*fir.m[j][i])%mod;
	    cout<

 

你可能感兴趣的:(算法模板,数论)