• POJ 3233 Matrix Power Series


    Matrix Power Series
    Time Limit: 3000MS Memory Limit: 131072K
    Total Submissions: 26212 Accepted: 10784
    Description

    Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.

    Input

    The input contains exactly one test case. The first line of input contains three positive integers n (n ≤ 30), k (k ≤ 109) and m (m < 104). Then follow n lines each containing n nonnegative integers below 32,768, giving A’s elements in row-major order.

    Output

    Output the elements of S modulo m in the same way as A is given.

    Sample Input

    2 2 4
    0 1
    1 1
    Sample Output

    1 2

    2 3

    构造矩阵,a0(A,E),a1(0,E);

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #include<queue>
    #include<map>
    #include<stack>
    #include<map>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define ll long long
    using namespace std;
    const int MAXN=100+10;
    const int inf=0x3f3f3f3f3f;
    const int mod=1000000007;
    int n,k,m;
    struct matrix{
        ll x[33*3][33*3];
        matrix(){
            mem(x,0);
        }
    };
    matrix mul(matrix a,matrix b){
        matrix c;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                for(int k=1;k<=n;k++){
                    c.x[i][j]=((a.x[i][k]*b.x[k][j])%m+c.x[i][j])%m;
                }
            }
        }
        return c;
    }
    matrix add(matrix a,matrix b){
        matrix c;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                c.x[i][j]=(a.x[i][j]+b.x[i][j])%m;
            }
        }
        return c;
    }
    matrix kum(matrix a,int i){
        matrix res;
        for(int i=1;i<=n;i++) res.x[i][i]=1;
        while(i){
            if(i&1){
                res=mul(res,a);}
            i>>=1;
            a=mul(a,a);
        }
        return res;
    }
    int main(){
        while(~scanf("%d%d%d",&n,&k,&m)){
            matrix a;
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++)
                    scanf("%d",&a.x[i][j]);
            }
            for(int i=1;i<=n;i++){
                    a.x[i][n+i]=1;
                    a.x[i+n][i+n]=1;
            }
            n*=2;
            matrix ans;
                ans=kum(a,k+1);
            n/=2;
            for(int i=1;i<=n;i++){
               if(i==1)ans.x[1][n+1]-=1;
                printf("%d",(ans.x[i][n+1]%m+m)%m);
                for(int j=n+2;j<=2*n;j++){
                    if(i==j-n)ans.x[i][j]-=1;
                    printf(" %d",(ans.x[i][j]%m+m)%m);
                }
                printf("
    ");
            }
        }
    }

    另一种做法

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #include<queue>
    #include<map>
    #include<stack>
    #include<map>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define ll long long
    using namespace std;
    int n,k,m;
    struct matrix{
        int x[35][35];
    };
    matrix mul(matrix a,matrix b){
        matrix c;
        mem(c.x,0);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                for(int k=1;k<=n;k++){
                    c.x[i][j]+=(a.x[i][k]*b.x[k][j]);
                    c.x[i][j]%=m;
                }
            }
        }
        return c;
    }
    matrix add(matrix a,matrix b){
        matrix c;mem(c.x,0);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                c.x[i][j]=a.x[i][j]+b.x[i][j];
                c.x[i][j]%=m;
            }
        }
        return c;
    }
    matrix kum(matrix a,int i){
        matrix res;mem(res.x,0);
        for(int i=1;i<=n;i++) res.x[i][i]=1;
        while(i){
            if(i&1){
                res=mul(res,a);}
            i>>=1;
            a=mul(a,a);
        }
        return res;
    }
    matrix sum(matrix a,int k){
        if(k==1)return a;
        matrix t=sum(a,k/2);
        if(k&1){
            matrix x=kum(a,k/2+1);
            t=add(t,mul(x,t));
            t=add(t,x);
        }
        else{
            matrix x=kum(a,k/2);
            t=add(t,mul(t,x));
        }
        return t;
    }
    int main(){
        scanf("%d%d%d",&n,&k,&m);
            matrix a;
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    scanf("%d",&a.x[i][j]);
                    }
            }
            matrix ans=sum(a,k);
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    printf("%d ",ans.x[i][j]);
                }
                printf("
    ");
            }
    }
    



  • 相关阅读:
    Http与WWW服务精解
    Http与WWW服务精解
    6-13
    好用的工具说明
    JVM、JRE和JDK三者间的区别和联系
    css进阶之二:flex弹性布局
    MVVM
    如何理解TCP的三次握手协议?
    java里面的设计模式
    linux常用命令
  • 原文地址:https://www.cnblogs.com/da-mei/p/9053242.html
Copyright © 2020-2023  润新知