POJ3233 Matrix Power Series 矩陣構造+矩陣快速冪

 構造一個矩陣

\large S=\begin{bmatrix} A & E\\ 0 & E \end{bmatrix}

發現

\large S^2=\begin{bmatrix} A & A+E\\ 0 & E \end{bmatrix}          \large S^3=\begin{bmatrix} A & A^2+A+E\\ 0 & E \end{bmatrix}         \large S^4=\begin{bmatrix} A & A^3+A^2+A+E\\ 0 & E \end{bmatrix}

所以我們只需要用快速冪計算S的k+1次方,然後將右上方的矩陣減去單位矩陣就是結果。

#include <cstdio>
#include <cstring>
#include <iostream>
#define ms(a,b) memset(a,b,sizeof(a))
#define mc(a,b) memcpy(a,b,sizeof(b))
using namespace std;
const int N=71;
int n,m;
void mul(int a[N][N],int b[N][N])
{
    int c[N][N];
    ms(c,0);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++) c[i][j]=(c[i][j]+a[i][k]*b[k][j])%m;
    mc(a,c);
}
void qpow(int a[N][N],int b)
{
    int c[N][N];
    ms(c,0);
    for(int i=1;i<=n;i++) c[i][i]=1;
    while(b)
    {
        if(b&1) mul(c,a);
        b>>=1;
        mul(a,a);
    }
    mc(a,c);
}
int main()
{
    int k,a[N][N];
    cin>>n>>k>>m;
    ms(a,0);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++) cin>>a[i][j]; 
        a[i][n+i]=a[n+i][n+i]=1;
    }   
    n<<=1;
    qpow(a,k+1);
    n>>=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=n+1;j<=(n<<1);j++)
        {
            if(i+n==j) cout<<((a[i][j]-1)%m+m)%m<<" ";
            else cout<<(a[i][j]%m+m)%m<<" ";
        }
        cout<<endl;
    }    
    //system("pause");
}

 

發佈了74 篇原創文章 · 獲贊 4 · 訪問量 5044
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章