杭电 3306 Another kind of Fibonacci 构造矩阵二分幂

原创 2012年03月23日 17:19:53

       这道题题意是比较简单的,方法也很容易想,构建矩阵,主要难度在构建矩阵的地方。由于A(n)=x*A(n-1)+Y*(n-2),因此可以把A(n)平方,再由S(n)=S(n-1)+A(n)*A(n),所以可以构建矩阵{A(n-2)*A(n-2),A(n-1)*A(n-1),A(n-1)*A(n-2),S(n-1)},{A(n-1)*A(n-1),A(n)*A(n),A(n-1)*A(n),S(n)},构建出矩阵之后就很容易了。。题目:

Another kind of Fibonacci

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 720    Accepted Submission(s): 296


Problem Description
As we all known , the Fibonacci series : F(0) = 1, F(1) = 1, F(N) = F(N - 1) + F(N - 2) (N >= 2).Now we define another kind of Fibonacci : A(0) = 1 , A(1) = 1 , A(N) = X * A(N - 1) + Y * A(N - 2) (N >= 2).And we want to Calculate S(N) , S(N) = A(0)2 +A(1)2+……+A(n)2.

 

Input
There are several test cases.
Each test case will contain three integers , N, X , Y .
N : 2<= N <= 231 – 1
X : 2<= X <= 231– 1
Y : 2<= Y <= 231 – 1
 

Output
For each test case , output the answer of S(n).If the answer is too big , divide it by 10007 and give me the reminder.
 

Sample Input
2 1 1 3 2 3
 

Sample Output
6 196
 

ac代码:

#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
typedef long long ll;
const ll MAX=10007;
const int row=5;//矩阵的维数,根据题目要求改变
ll aa[11][11],bb[11][11];//aa,bb存储矩阵
ll cc[11][11];//结果矩阵
ll dd[11][11];//单位矩阵
ll mi,x,y;//多少次方
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::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];//原矩阵
   bb[2][1]=1;bb[1][2]=a[1];bb[2][2]=a[2];bb[3][2]=a[3];
   bb[2][3]=x;bb[3][3]=y;bb[1][4]=y*y;bb[2][4]=x*x;
   bb[3][4]=2*x*y;bb[4][4]=1;
}
//矩阵乘法
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(){
	while(~scanf("%lld%lld%lld",&mi,&x,&y)){
	  x=x%MAX;y=y%MAX;
	  ll f[11],num[11];
      f[1]=1;f[2]=1;f[3]=1;f[4]=2;
	  num[1]=y*y;num[2]=x*x;num[3]=2*x*y;num[4]=0;num[5]=0;
      matrix mm;
      if(mi==1){
	    cc[1][row-1]=2%MAX;
	  }
	  else if(mi==0)
		  cc[1][row-1]=1%MAX;
	  else{
	    mm.initmatrix(f,num);
	    mm.matrixmi(mi-1);
	  }
	  printf("%lld\n",cc[1][row-1]);
	}
  return 0;
}


矩阵快速幂入门 + 求Fibonacci数列

两矩阵相乘,朴素算法的复杂度是O(N^3)。如果求一次矩阵的M次幂,按朴素的写法就是O(N^3*M)。既然是求幂,不免想到快速幂取模的算法,a^b %m 的复杂度可以降到O(logb)。如果矩阵相乘是...
  • zhulei19931019
  • zhulei19931019
  • 2016年10月03日 23:01
  • 198

HDU 1021 斐波那契问题

Fibonacci Again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...
  • wangming520liwei
  • wangming520liwei
  • 2014年01月23日 15:17
  • 1020

poj 3070 Fibonacci(矩阵快速幂模板,斐波那契)

Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12812   Acc...
  • acm_cxq
  • acm_cxq
  • 2016年07月18日 17:35
  • 386

快速Fibonacci数列,矩阵法

这个题是要用矩阵的知识解决斐波那契数列,题目中给的公式很简单,直接往上套就行了,那我们就先看除了题目给的方法外的另一个方法,当然还是矩阵。 先看下面的公式: 不难看出这个式子是把:...
  • u013068502
  • u013068502
  • 2014年08月01日 16:25
  • 1451

POJ——3070Fibonacci(矩阵快速幂)

Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12329   Acc...
  • a88770202
  • a88770202
  • 2016年05月12日 16:44
  • 173

fibonacci 数列的快速幂求法

一、经典解法        Fibonacci数列的经典解法,即递归解法,如下 int fib(int n){ if(n ...
  • zhangpiu
  • zhangpiu
  • 2016年03月25日 14:19
  • 748

常规求幂、二分求幂、快速位求幂

常规求幂、二分求幂、快速求幂
  • u012273328
  • u012273328
  • 2016年04月13日 20:40
  • 978

杭电OJ--2098 分拆素数和

Problem Description 把一个偶数拆成两个不同素数的和,有几种拆法呢?   Input 输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。 ...
  • lishuhuakai
  • lishuhuakai
  • 2015年09月10日 08:30
  • 1270

HDU1021 ZOJ2060 Fibonacci Again【斐波拉契数列+模除+水题】

Fibonacci Again Time Limit: 2 Seconds      Memory Limit: 65536 KB There are another kind of Fibona...
  • tigerisland45
  • tigerisland45
  • 2016年05月27日 10:13
  • 541

poj 3233 Matrix Power Series(矩阵快速幂+二分求和)

题意: 给定一个n*n的矩阵A,要求(A+A^2+....A^K)%m后的矩阵 解析: 对于任意的A^x,我们都能够利用矩阵快速幂求出,但是我们现在要求的是和。 仔细观察整个式子,那么我们可以对...
  • hlmfjkqaz
  • hlmfjkqaz
  • 2013年11月19日 21:02
  • 694
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:杭电 3306 Another kind of Fibonacci 构造矩阵二分幂
举报原因:
原因补充:

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