zoukankan      html  css  js  c++  java
  • POJ3233 Matrix Power Series

    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
     
     
    正解:矩乘快速幂+二分
    解题报告;
      今天考试T1。
      考场上面推了一个上午的式子,好不容易发现一个,而且是一个log的,结果太复杂了,没调出来。最后没办法了,临时yy了一个两个log的方法,好歹也过了。
      考虑只有两种可能,题目相当于是要求一个前缀和,那么矩乘满足分配律,所以我们可以直接利用前面的结果乘起来就可以了。 
      还是数学题做少了,不会推式子,还是要多练。
     
      当然还有一个log的方法,就是直接倒着做,其余的完全相同。
     
      两个log:
     
     1 //It is made by jump~
     2 #include <iostream>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <cstdio>
     6 #include <cmath>
     7 #include <algorithm>
     8 #include <ctime>
     9 #include <vector>
    10 #include <queue>
    11 #include <map>
    12 #include <set>
    13 using namespace std;
    14 typedef long long LL;
    15 #define RG register
    16 int n,k,MOD;
    17 int dui[45],tail;
    18 
    19 struct juz{
    20     LL s[33][33];
    21 }a,c[45],ini,mi[45];
    22 
    23 inline int getint()
    24 {
    25        RG int w=0,q=0;    char c=getchar();    while((c<'0' || c>'9') && c!='-') c=getchar();
    26        if (c=='-')  q=1, c=getchar();  while (c>='0' && c<='9') w=w*10+c-'0', c=getchar();  return q ? -w : w;
    27 }
    28 
    29 inline juz jia(juz p,juz q){
    30     juz tmp;
    31     for(RG int i=1;i<=n;i++)
    32     for(RG int j=1;j<=n;j++)
    33         tmp.s[i][j]=p.s[i][j]+q.s[i][j],tmp.s[i][j]%=MOD;
    34     return tmp;
    35 }
    36 
    37 inline juz cheng(juz p,juz q){
    38     juz tmp;
    39     for(RG int i=1;i<=n;i++) for(RG int j=1;j<=n;j++) tmp.s[i][j]=0;
    40     for(RG int i=1;i<=n;i++)
    41     for(RG int j=1;j<=n;j++)
    42         for(RG int l=1;l<=n;l++)
    43         tmp.s[i][j]+=p.s[i][l]*q.s[l][j],tmp.s[i][j]%=MOD;
    44     return tmp;
    45 }
    46 
    47 inline void work(){    
    48     n=getint(); k=getint(); MOD=getint();    
    49     for(RG int i=1;i<=n;i++) for(RG int j=1;j<=n;j++) ini.s[i][j]=getint();        
    50     while(k>0) dui[++tail]=k,k>>=1; mi[tail]=ini; c[tail]=ini;
    51     for(RG int i=tail-1;i>=1;i--) {
    52     mi[i]=cheng(mi[i+1],mi[i+1]);//每次平方
    53     c[i]=jia(c[i+1],cheng(c[i+1],mi[i+1]));//前面的乘以之前的部分再加上自己可降低复杂度
    54     if(dui[i]&1) mi[i]=cheng(mi[i],ini),c[i]=jia(c[i],mi[i]);
    55     }
    56     for(RG int i=1;i<=n;i++) { for(RG int j=1;j<=n;j++) printf("%lld ",c[1].s[i][j]); printf("
    "); }
    57 }
    58 
    59 int main()
    60 {
    61   work();
    62   return 0;
    63 }

    一个log:

     1 //It is made by jump~
     2 #include <iostream>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <cstdio>
     6 #include <cmath>
     7 #include <algorithm>
     8 #include <ctime>
     9 #include <vector>
    10 #include <queue>
    11 #include <map>
    12 #include <set>
    13 using namespace std;
    14 typedef long long LL;
    15 #define RG register
    16 int n,k,MOD;
    17 int dui[45],tail;
    18 
    19 struct juz{
    20     LL s[33][33];
    21 }a,c[45],ini,mi[45];
    22 
    23 inline int getint()
    24 {
    25        RG int w=0,q=0;    char c=getchar();    while((c<'0' || c>'9') && c!='-') c=getchar();
    26        if (c=='-')  q=1, c=getchar();  while (c>='0' && c<='9') w=w*10+c-'0', c=getchar();  return q ? -w : w;
    27 }
    28 
    29 inline juz jia(juz p,juz q){
    30     juz tmp;
    31     for(RG int i=1;i<=n;i++)
    32     for(RG int j=1;j<=n;j++)
    33         tmp.s[i][j]=p.s[i][j]+q.s[i][j],tmp.s[i][j]%=MOD;
    34     return tmp;
    35 }
    36 
    37 inline juz cheng(juz p,juz q){
    38     juz tmp;
    39     for(RG int i=1;i<=n;i++) for(RG int j=1;j<=n;j++) tmp.s[i][j]=0;
    40     for(RG int i=1;i<=n;i++)
    41     for(RG int j=1;j<=n;j++)
    42         for(RG int l=1;l<=n;l++)
    43         tmp.s[i][j]+=p.s[i][l]*q.s[l][j],tmp.s[i][j]%=MOD;
    44     return tmp;
    45 }
    46 
    47 inline void work(){    
    48     n=getint(); k=getint(); MOD=getint();    
    49     for(RG int i=1;i<=n;i++) for(RG int j=1;j<=n;j++) ini.s[i][j]=getint();        
    50     while(k>0) dui[++tail]=k,k>>=1; mi[tail]=ini; c[tail]=ini;
    51     for(RG int i=tail-1;i>=1;i--) {
    52     mi[i]=cheng(mi[i+1],mi[i+1]);//每次平方
    53     c[i]=jia(c[i+1],cheng(c[i+1],mi[i+1]));//前面的乘以之前的部分再加上自己可降低复杂度
    54     if(dui[i]&1) mi[i]=cheng(mi[i],ini),c[i]=jia(c[i],mi[i]);
    55     }
    56     for(RG int i=1;i<=n;i++) { for(RG int j=1;j<=n;j++) printf("%lld ",c[1].s[i][j]); printf("
    "); }
    57 }
    58 
    59 int main()
    60 {
    61   work();
    62   return 0;
    63 }
  • 相关阅读:
    Python os模块
    Python 常用模块
    CentOS7中配置基于Nginx+Supervisor+Gunicorn的Flask项目
    CentOS下安装Python3.4
    修改windows文件的换行符
    dubbo源码阅读-ProxyFactory(十一)之JdkProxyFactory
    dubbo源码阅读-Filter默认实现(十一)之DeprecatedFilter
    dubbo源码阅读-Filter默认实现(十一)之TimeoutFilter
    dubbo源码阅读-Filter默认实现(十一)之ExceptionFilter
    dubbo源码阅读-Filter默认实现(十一)之ContextFilter&ConsumerContextFilter
  • 原文地址:https://www.cnblogs.com/ljh2000-jump/p/5903458.html
Copyright © 2011-2022 走看看