模板 n维矩阵的二分幂

原创 2012年03月23日 15:43:28

      今天一上午一下午就干了点这,就写了一个这样恶心的模板,,写出来我自己都不想看,,不过还好,可以用。。这个模板可以求n维矩阵的二分幂,主要适用于递推式求值的题目。。

代码:

#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
typedef long long ll;
const ll MAX=1000007;
const int row=3;//矩阵的维数,根据题目要求改变
ll aa[11][11],bb[11][11];//aa,bb存储矩阵
ll cc[11][11];//结果矩阵
ll dd[11][11];//单位矩阵
ll mi;//多少次方
class matrix{
public:
	void input(ll f[11],ll num[11]);
	void initmatrix(ll p[11],ll q[11]);
	void matrixmi(int x);//矩阵幂
	void matrixfun(ll a[11][11],ll b[11][11]);//矩阵乘积
};
void matrix::input(ll f[11],ll num[11]){
  	//输入前几项
	for(int i=1;i<row;++i){
	  scanf("%lld",&f[i]);
	}
	//输入前几项对应的系数
	for(int i=1;i<=row;++i){
	  scanf("%lld",&num[i]);
	}
	//输入所求的n次方
	scanf("%lld",&mi);
}
//构造矩阵
void matrix::initmatrix(ll ff[11],ll a[11]){
   memset(aa,0,sizeof(aa));
   memset(bb,0,sizeof(bb));
   //构造单位矩阵
   for(int i=1;i<=row;++i){
     for(int j=1;j<=row;++j)
		 dd[i][j]=0;
	 dd[i][i]=1;
   }
    for(int i=1;i<row;++i)
	   aa[1][i]=ff[i];
   aa[1][row]=a[row];//原矩阵
   for(int i=1;i<=row-2;++i)
	   bb[i+1][i]=1;
   bb[row][row]=1;bb[row][row-1]=1;
   for(int i=1;i<row;++i)
     bb[i][row-1]=a[i];//构造所要乘的矩阵
}
//矩阵乘法
void matrix::matrixfun(ll a[11][11],ll b[11][11]){
  long long sum=0;
  memset(cc,0,sizeof(cc));
  for(int i=1;i<=row;++i){
	  for(int j=1;j<=row;++j){
	    sum=0;
		for(int k=1;k<=row;++k)
			sum+=(a[i][k]*b[k][j]);
		cc[i][j]=(sum%MAX);
	  }
  }
}
//矩阵二分幂
void matrix::matrixmi(int x){
	while(x){
		if(x&1){
		  matrixfun(dd,bb);
		  for(int i=1;i<=row;++i)
			  for(int j=1;j<=row;++j)
				  dd[i][j]=cc[i][j];
		}
		matrixfun(bb,bb);
		for(int i=1;i<=row;++i)
			for(int j=1;j<=row;++j)
				bb[i][j]=cc[i][j];
		x=x>>1;
	}
	matrixfun(aa,dd);
}
int main(){
  int numcase;
  scanf("%d",&numcase);
  while(numcase--){
    matrix mm;
	ll f[11],num[11];
	mm.input(f,num);
	if(mi<row){
	  cc[1][row-1]=f[mi]%MAX;
	}
	else{
	  mm.initmatrix(f,num);
	  mm.matrixmi(mi-2);
	}
	if(cc[1][row-1]>0)
	printf("%lld\n",cc[1][row-1]);
	else
		printf("%lld\n",cc[1][row-1]+MAX);
  }
  return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

POJ3233 矩阵的N次幂求和 二分

k 为偶数:A^k = A ^(k/2) * A ^(k/2); k 为奇数: A^k = A ^ (k/2) * A^(k/2) * A    n  = 2k 为偶数 A^1 + ...

矩阵快速二分求n次幂

http://ac.jobdu.com/problem.php?id=1081     递推数列 同理Fibonacci数列也可以使用矩阵来求,二分求矩阵的n次幂可以达到O(N*lgN)的时间复杂度。...

n维矩阵乘法

  • 2012-12-11 19:02
  • 220KB
  • 下载

n维矩阵求逆的c程序

【HDU5895 2016 ACM ICPC Asia Regional Shenyang Online D】【公式转化 矩阵快速幂 欧拉定义】Mathematician QSC 递推数列前n平方项和

Mathematician QSC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Oth...

MATLAB将N维矩阵点分区

ZJC-1489 L先生与质数V4 51Nod-1184 第N个素数 (大区间求素数个数模板+二分)

Description 在解决了上一个质数问题之后,L先生依然不甘心,他还想计算下更多范围内的质数,你能帮助他吗?(没错这题题面和V3一毛一样) Input 有多组测试例。(测试例数量<70) 每个测...
  • yo_bc
  • yo_bc
  • 2017-07-11 01:19
  • 85

51Nod-斐波那契数列的第N项(矩阵快速幂)

 1242 斐波那契数列的第N项 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 斐波那...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)