1. 程式人生 > >POJ 3233 Matrix Power Series (矩陣乘法+快速冪+等比二分求和)

POJ 3233 Matrix Power Series (矩陣乘法+快速冪+等比二分求和)

再加上快速冪演算法和就好了

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
struct Matrix{
	int a[32][32];
	int r; // r*r 
	Matrix(int r):r(r){memset(a,0,sizeof(a));} //初始化長
	void MakeI(int x){             //變為x*E的單位矩陣 
		memset(a,0,sizeof(a));
		for(int i=0;i<r;i++) a[i][i]=x;
	}
	Matrix operator * (const Matrix& m) {  //矩陣乘法 
		Matrix result(r);
		for(int i=0;i<r;i++)
		for(int j=0;j<r;j++)
		{
			for(int k=0;k<r;k++)
				result.a[i][j]+=a[i][k]*m.a[k][j];
		}
		return result;
	}
	Matrix operator % (const int p){ //矩陣對每個元素取餘 
		Matrix result(*this);
		for(int i=0;i<r;i++)
		for(int j=0;j<r;j++)
			result.a[i][j]%=p;
		return result;
	}
	Matrix operator + (const Matrix& m){  //矩陣互相相加 
		Matrix result(r);
		for(int i=0;i<r;i++)
		for(int j=0;j<r;j++)
			result.a[i][j]=a[i][j]+m.a[i][j];
		return result;
	}
	Matrix operator + (int n){     //加上個常數 
		Matrix result(r);
		result.MakeI(n);
		return *this+result;
	}
};
Matrix PowMod(const Matrix& m,int k,int p)  //矩陣快速冪
{   //m^k mod p
	int r=m.r;
	Matrix result(r);
	result.MakeI(1); //變成單位矩陣 
	Matrix base=m;
	while(k){
		if(k&1) result=result*base%p;
		base=base*base%p;
		k>>=1;
	} 
	return result;
}
Matrix PowSumMod(const Matrix& m,int k,int p)   //等比二分求和
{
	if(k==1) return Matrix(m)%p;
	else if(k%2==0) return (PowMod(m,k/2,p)+1)*PowSumMod(m,k/2,p)%p;
	else return ((PowMod(m,(k-1)/2,p)+1)*PowSumMod(m,(k-1)/2,p)%p + PowMod(m,k,p))%p; 
}
int main()
{
	int r,k,p;
	cin>>r>>k>>p;
	Matrix m(r);
	for(int i=0;i<r;i++)
	for(int j=0;j<r;j++)
		cin>>m.a[i][j],m.a[i][j]%=p;  //一定這裡就要取模,不然會WR!! 
	Matrix result=PowSumMod(m,k,p);
	for(int i=0;i<r;i++)
	{
		for(int j=0;j<r;j++)
		{
			if(j) cout<<' ';
			cout<<result.a[i][j];
		}
		cout<<endl;
	}
	return 0;
}


相關推薦

POJ 3233 Matrix Power Series (矩陣乘法+快速+二分求和)

再加上快速冪演算法和就好了 #include<iostream> #include<cstring> #include<string> #include<cstdio> #include<algorithm>

POJ 3233-Matrix Power Series( S = A + A^2 + A^3 + … + A^k 矩陣快速取模)

spa nta plm lines case arch lang stream 矩陣 Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 20309

POJ 3233 Matrix Power Series 【經典矩陣快速二分

ace series printf acc align clu same pro max 任意門:http://poj.org/problem?id=3233 Matrix Power Series Time Limit: 3000MS Memory Limit

POJ 3233 Matrix Power Series矩陣快速+矩陣

——————————————————- Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 20125 Accept

POJ 3233 Matrix Power Series 解題報告(子矩陣構造+矩陣快速

Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 14105 Accepted: 6078 Description Given a n × n m

POJ 3233 Matrix Power Series(求矩陣的和——分塊矩陣快速 or 二分遞迴+矩陣快速)

Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 21451 Accepted:

POJ 3233 Matrix Power Series矩陣快速+等比數列二分求和

Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 23205 Accepted: 9669 Description Given a n × n ma

poj 3233 Matrix Power Series (構造分塊矩陣

題目連結:哆啦A夢傳送門 題意:自己看。 參考部落格:神犇 題解:分塊矩陣:分塊矩陣可以構造求和。 例如:我們可以這樣構造, 還需注意一點的是:算完S(k+1),取出右上角矩陣分塊後,還需減掉單位矩陣E。   程式碼不是我寫的,我就按自己習慣改了下變數

POJ 3233 Matrix Power Series矩陣等比數列求和

題意就是一個等比數列求和的意思,只不過每一項都是矩陣 這裡需要進行一下轉移矩陣的構造,形成一個遞推累加的效果: 設 B = (A,I;0,I) 則B^(k + 1) = (A^(k + 1),I + A + A^2 + A^3 + … + A^k;0,I)

POJ 3233 Matrix Power Series

sin 多個 ide input span 拆分 lang con 快速冪 Matrix Power Series Time Limit:3000MS Memory Limit:131072K Description Given a n × n matrix A and

POJ 3233 Matrix Power Series(java)

型別:矩陣快速冪+二分 題解: S1=A1; S2=A1+A2=A1x(1+A1)=A1xS1; S3=A1+A2+A3=A1x(1+A1)+A3=A1xS1+A3; S4=A1+A2+A3+A4=A2x(1+A1+A2)=A2xS2; 然後這道

POJ 3233 Matrix Power (矩陣快速+等比數列求和)

Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 23165 Accepted: 9651 Description Gi

poj3233 Matrix Power Series 矩陣快速

分享 std 答案 span print .org log .cn ring 題目鏈接: http://poj.org/problem?id=3233 題意: 給你A矩陣,A矩陣是n*n的一個矩陣,現在要你求S = A + A^2 + A^3 + … + A^k.那麽s一定

Matrix Power Series[矩陣加速]

cpp set size oid std con reg class gis 個人認為這這種解法是這道題比較妙的解法, 因為它是從矩陣加速遞推的板子中合理衍生得到的. 設f[n]=A^1+A^2+A^3+...+A^n 則f[n]=A+f[n-1]*A 轉化成矩陣加速遞推(

POJ 3222 Matrix Power Series矩陣前n項之和(性質 OR 二分?)】

Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 20879 Accepted:

【bzoj3231】[Sdoi2008]遞歸數列 矩陣乘法+快速

style 其中 std span 處理 轉化 struct set sizeof 題目描述 一個由自然數組成的數列按下式定義: 對於i <= k:ai = bi 對於i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k

各種斐波那契矩陣乘法快速

T1 f[1]=1; f[2]=1; f[n]=f[n-1]+f[n-2]; 求f[n] n<2^32 思路 暴力顯然不行。 現在需要一種更強的方法:矩陣乘法。 考慮矩陣[f[n-1],f[n]]*A=[f[n],f[n-1]+f[n]]

HDU 1005 Number Sequence(矩陣乘法+快速

Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.

POJ——1845 Sumdiv (尤拉篩+快速+遞迴二分

Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. Determine S modulo 9901 (the rest of the division of S by 9901)

Matrix Power Series POJ - 3233 (矩陣快速)

傳送門 題意: 題解: 附上程式碼: #include<iostream> #include<cstdio> using namespace std; typedef long long ll; const int MAXN=70; struct n