zoukankan      html  css  js  c++  java
  • POJ 3233 Matrix Power Series 矩阵快速幂

    设S[k] = A + A^2 +````+A^k.

    设矩阵T =

    A[1] 0
    E E

    这里的E为n*n单位方阵,0为n*n方阵

    令A[k] = A ^ k

    矩阵B[k] =

    A[k+1]
    S[k]

    则有递推式B[K] = T*B[k-1],即有B[k] = T^k*B[0],令S[0] 为n*n的0矩阵。

    矩阵快速幂求出即可·····

    还可以使用两次分治的方法····自行百度····

    贴代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 int n,k,p,d;//d = 2*n
     4 struct matrix
     5 {
     6     int m[70][70];
     7 } A;
     8 matrix mul(int a[70][70],int b[70][70])
     9 {
    10     matrix ans;
    11     memset(ans.m,0,sizeof(ans.m));
    12     for(int i=1; i<=d; ++i)
    13         for(int j=1; j<=d; ++j)
    14             for(int k=1; k<=d; ++k)
    15                 ans.m[i][j] = (ans.m[i][j] + a[i][k]*b[k][j]%p)%p;
    16     return ans;
    17 }
    18 matrix qPow()
    19 {
    20     matrix ans;
    21     memset(ans.m,0,sizeof(ans.m));
    22     for(int i=1; i<=d; ++i)
    23         ans.m[i][i] = 1;
    24     while(k)
    25     {
    26         if(k&1) ans = mul(ans.m,A.m);
    27         A = mul(A.m,A.m);
    28         k >>= 1;
    29     }
    30     return ans;
    31 }
    32 int main()
    33 {
    34 //    freopen("in.txt","r",stdin);
    35     while(~scanf("%d%d%d",&n,&k,&p))
    36     {
    37         memset(A.m,0,sizeof(A.m));
    38         int t[35][35];
    39         for(int i=1; i<=n; ++i)
    40         {
    41             for(int j=1; j<=n; ++j)
    42             {
    43                 scanf("%d",&A.m[i][j]);
    44                 t[i][j] = A.m[i][j];
    45             }
    46         }
    47         for(int i=n+1; i<=2*n; ++i)
    48             A.m[i][i-n] = 1,A.m[i][i] = 1;
    49         d = n<<1;
    50         matrix ans = qPow();
    51         for(int i=n+1; i<=d; ++i)
    52         {
    53             for(int j=1; j<=n; ++j)
    54             {
    55                 int res =0;
    56                 for(int k=1; k<=n; ++k)
    57                     res = (res + ans.m[i][k]*t[k][j]%p)%p;
    58                 if(j != 1) printf(" ");
    59                 printf("%d",res);
    60             }
    61             puts("");
    62         }
    63     }
    64     return 0;
    65 }
    View Code
  • 相关阅读:
    自然二进制与格雷码的转换
    状态机小结
    FSM的几种策略
    跨越鸿沟:同步世界中的异步信号
    边沿检测技术
    门控时钟和时钟使能
    ALTERA器件中复位电路实现之-异步复位同步化
    同步复位
    Altera USB Blaster 仿真器(EPM240仿制版
    五、裸机烧写
  • 原文地址:https://www.cnblogs.com/allh123/p/3284761.html
Copyright © 2011-2022 走看看