矩阵——poj3233Matrix Power Series

来源:互联网 发布:python计算器源代码 编辑:程序博客网 时间:2024/06/07 06:14

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 longusing 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");        }}
1 0
原创粉丝点击