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

    求矩阵和的问题。这题我参考罗牛的思路,把前K次和分解为2的幂和,比如25 = 1+8+16。比较郁闷的是,我的代码和他的比,可以说除了变量名其它都一样,结果人家跑16ms,我的141ms。

     1 #include <cstdio>
     2 int m,n,K;
     3 int pow[30][31][31],sum[30][31][31];
     4 void add(int a[31][31],int b[31][31],int c[31][31])
     5 {
     6     for(int i = 0; i < n; i++)
     7         for(int j = 0; j < n; j++)
     8             a[i][j] = (c[i][j]+b[i][j])%m;
     9 }
    10 void mul(int a[31][31],int b[31][31],int c[31][31])
    11 {
    12     int i,j,k;
    13     for(i = 0; i < n; i++)
    14         for(j = 0; j < n; j++)
    15         {
    16             a[i][j] = 0;
    17             for(k = 0; k < n; k++)
    18                 a[i][j] = (a[i][j]+b[i][k]*c[k][j])%m;
    19         }
    20 
    21 }
    22 int main()
    23 {
    24     int i,j,t;
    25     int tmp[31][31],ans[31][31]={};
    26     scanf("%d%d%d",&n,&K,&m);
    27     for(i = 0; i < n; i++)
    28         for(j = 0; j < n; j++)
    29         {
    30             scanf("%d",&t);
    31             pow[0][i][j] = sum[0][i][j] = t%m;
    32         }
    33     for(i = 1; (1<<i) <= K; i++)
    34     {
    35         mul(pow[i],pow[i-1],pow[i-1]);
    36         mul(tmp,sum[i-1],pow[i-1]);
    37         add(sum[i],tmp,sum[i-1]);
    38     }
    39     for(i = 0; K; K>>=1,i++)
    40     {
    41         if(K&1)
    42         {
    43             mul(tmp,ans,pow[i]);
    44             add(ans,tmp,sum[i]);
    45         }
    46     }
    47     for(i = 0; i < n; i++)
    48     {
    49         printf("%d",ans[i][0]);
    50         for(j = 1; j < n; j++)
    51             printf(" %d",ans[i][j]);
    52         printf("\n");
    53     }
    54     return 0;
    55 }
  • 相关阅读:
    HDU 3949 XOR
    [JXOI2018]游戏
    树状数组 Binary Indexed Tree/Fenwick Tree
    Java 多线程编程
    概率算法
    最长回文子串 Manacher算法
    动态规划-最长上升子序列 LIS
    流水作业调度
    多机调度问题
    A*搜索算法
  • 原文地址:https://www.cnblogs.com/lzxskjo/p/3031413.html
Copyright © 2011-2022 走看看