矩阵——poj3233Matrix Power Series

http://poj.org/problem?id=3233
从《十个利用矩阵乘法解决的经典题目》里面看到的
首先感谢

Matrix67

大佬
然后发现这个人的名字和题目名很像;

A + A^2 + A^3 + A^4 + A^5 + A^6 =
(A + A^2 + A^3) + A^3*(A + A^2 + A^3)

关于奇偶自己搞就好了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define Ll long long
using namespace std;
struct jv{
    int n,m;
    int a[31][31];
    jv(){n=m=0;memset(a,0,sizeof a);}
}a,ans;
int n,mo,k;
jv cheng(jv a,jv b){
    jv ans; ans.n=a.n; ans.m=b.m;
    for(int i=1;i<=a.n;i++)
        for(int k=1;k<=a.m;k++)if(a.a[i][k])
            for(int j=1;j<=b.m;j++)
                ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j])%mo;
    return ans; 
}
jv jia(jv a,jv b){
    jv ans; ans.n=a.n; ans.m=b.m;
    for(int i=1;i<=a.n;i++)
        for(int j=1;j<=b.m;j++)
                ans.a[i][j]=(a.a[i][j]+b.a[i][j])%mo;
    return ans; 
}
jv ksm(int y){
    jv ans=a,c=a;
    y-=1;
    while(y){
        if(y&1)ans=cheng(ans,c);
        y>>=1;
        c=cheng(c,c);
    }
    return ans;
}
jv find(int k){
    if(k==1)return a;
    if(k&1)return jia(ksm(k),find(k-1));
    jv c=find(k/2);//要先提出
    return jia(c,cheng(c,ksm(k/2)));
}
int main(){
    scanf("%d%d%d",&n,&k,&mo);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%d",&a.a[i][j]);
    a.n=n; a.m=n;
    ans=find(k);
    for(int i=1;i<=ans.n;i++){
        for(int j=1;j<=ans.m;j++)
            printf("%d ",ans.a[i][j]);printf("\n");
        }
}
posted @ 2017-05-02 14:59  largecube233  阅读(182)  评论(0编辑  收藏  举报