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