zoukankan      html  css  js  c++  java
  • poj 3233 Matrix Power Series

                                                                       Matrix Power Series
    Time Limit: 3000MS Memory Limit: 131072K
    Total Submissions: 3112 Accepted: 1163

    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

    Source

    POJ Monthly--2007.06.03, Huang, Jinsong

    [Submit]   [Go Back]   [Status]   [Discuss]

     

    //5138440 11410 3233 Wrong Answer   C++ 1597B 2009-05-12 11:28:50 
    //5138462 11410 3233 Accepted 876K 125MS C++ 1718B 2009-05-12 11:34:08 
    //Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.
    #include <iostream>
    #define MAX 33
    using namespace std;
    typedef 
    struct node
    {
        
    int matirx[MAX][MAX];
    }Matrix;
    Matrix a,sa,unit;
    int n,k,m;
    void Init()
    {
        
    int i,j;
        
    for(i=0;i<n;i++)
            
    for(j=0;j<n;j++)
            {
                scanf(
    "%d",&a.matirx[i][j]);
                a.matirx[i][j]
    %=m;   //初始化要先%m
                unit.matirx[i][j]=(i==j);  //如果i==j那么矩阵中此值就是1,否则为0,就是主对角线是1的单位矩阵
            }
    }
    Matrix Add(Matrix a,Matrix b)  
    //矩阵加法
    {
        Matrix c;
        
    int i,j;
        
    for(i=0;i<n;i++)
            
    for(j=0;j<n;j++)
            {
                c.matirx[i][j]
    =a.matirx[i][j]+b.matirx[i][j];
                c.matirx[i][j]
    %=m;   //加的时候也要%m
            }
        
    return c;
    }
    Matrix Mul(Matrix a,Matrix b)  
    //矩阵乘法
    {
        Matrix c;
        
    int i,j,k;
        
    for(i=0;i<n;i++)
            
    for(j=0;j<n;j++)
            {
                c.matirx[i][j]
    =0;  //初始化矩阵c
                for(k=0;k<n;k++)
                    c.matirx[i][j]
    +=a.matirx[i][k]*b.matirx[k][j];
                c.matirx[i][j]
    %=m;  //计算乘法的时候也要%m
            }
        
    return c;
    }
    Matrix Cal(
    int exp)   //矩阵幂
    {
        Matrix p,q;
        p
    =a;  //p是初始矩阵
        q=unit;  //q是单位矩阵
        while(exp!=1)
        {
            
    if(exp&1)  //要求得幂是奇数
            {
                exp
    --;
                q
    =Mul(p,q);
            } 
            
    else    //要求的幂是偶数
            {
                exp
    >>=1;  //相当于除2
                p=Mul(p,p);
            }
        }
        p
    =Mul(p,q);
        
    return p;
    }
    Matrix MatrixSum(
    int k)
    {
        
    if(k==1)  //做到最底层就将矩阵a返回就好
            return a;
        Matrix temp,tnow;
        temp
    =MatrixSum(k/2);
        
    if(k&1)  //如果k是奇数
        {
            tnow
    =Cal(k/2+1);
            temp
    =Add(temp,Mul(temp,tnow));
            temp
    =Add(tnow,temp);
        }  
        
    else    //如果k是偶数
        {
            tnow
    =Cal(k/2);
            temp
    =Add(temp,Mul(temp,tnow));
        }
        
    return temp;
    }
    int main()
    {
        
    int i,j;
        
    while(scanf("%d%d%d",&n,&k,&m)!=EOF)
        {
            Init();
            sa
    =MatrixSum(k);
            
    for(i=0;i<n;i++)
            {
                
    for(j=0;j<n-1;j++)
                {
                    printf(
    "%d ",sa.matirx[i][j]%m);
                }
                printf(
    "%d\n",sa.matirx[i][n-1]%m);
            }
        }
        
    return 0;
    }
  • 相关阅读:
    878. 第 N 个神奇数字
    Leetcode 239. 滑动窗口最大值
    欢天喜地七仙女——Beta冲刺三
    欢天喜地七仙女——Beta冲刺二
    欢天喜地七仙女——Beta冲刺一
    欢天喜地七仙女——Beta冲刺凡事预则立
    欢天喜地七仙女——Beta冲刺代码规范与计划
    欢天喜地七仙女Alpha总结展望——前事不忘后事之师
    欢天喜地七仙女——Alpha测试随笔
    欢天喜地七仙女——Alpha冲刺总结
  • 原文地址:https://www.cnblogs.com/forever4444/p/1454736.html
Copyright © 2011-2022 走看看