zoukankan      html  css  js  c++  java
  • 矩阵快速幂 模板与简单讲解

    模板

    快速幂模板

     1 void solve(matrix t,long long o)
     2 {
     3     matrix e;
     4 
     5     memset(e.a,0,sizeof(e.a));
     6 
     7     for (int i = 0;i < d;i++)
     8         e.a[i][i] = 1;
     9 
    10     while (o)
    11     {
    12         if (o & 1)
    13         {
    14             e = mul(e,t);
    15         }
    16 
    17         o >>= 1;
    18 
    19         t = mul(t,t);
    20     }
    21 
    22     long long res = 0;
    23 
    24     for (int i = 0;i < d;i++)
    25         res = (res + e.a[0][i] * f[d-i-1]) % m;
    26 
    27     printf("%lld
    ",res);
    28 }

    矩阵相乘代码

     1 struct matrix
     2 {
     3     long long a[20][20];
     4 };
     5 
     6 matrix mul(matrix x,matrix y)
     7 {
     8     matrix c;
     9 
    10     for (int i = 0;i < d;i++)
    11         for (int j = 0;j < d;j++)
    12     {
    13         c.a[i][j] = 0;
    14 
    15         for (int k = 0;k < d;k++)
    16         {
    17             c.a[i][j] = (c.a[i][j] + x.a[i][k] * y.a[k][j] % m) % m;
    18         }
    19     }
    20 
    21     return c;
    22 }

    简单讲解:

    矩阵快速幂,就只是把快速幂中的数改成了矩阵,兰儿其实还是有不同的地方,因为快速幂一般用的是递归实现,但是lrj大大说矩阵快速幂还是用迭代实现比较好。

    举一个例子,A^15,可以写成(A^8) * (A^4) * (A^2) * (A^1) 的形式,可以看到8,4,2,1都是2的次幂,所以我们就可以方便的运用位运算。

    15:1111,那么每次这个数字右移一位,那么矩阵就平方一次,然后遇到当前的最后一位111k,k & 1 == 1,这个时候结果矩阵就要乘以当前的用于运算的矩阵。

    矩阵预算也是挺好理解的,用手算模拟一下就可以了。

  • 相关阅读:
    grep使用多个查询条件--或
    Qt Quick App的两种启动模式
    ICP编程软件配置(烧写KEIL编译后的bin文件)
    C/C++语言中const的用法
    QT小插件类之QRoundProgressBar
    QT实现单个EXE文件
    QT小技巧学习记录
    无线路由器的五种工作模式
    Qt5.4静态编译方法
    Altium Designer极坐标布局方法
  • 原文地址:https://www.cnblogs.com/kickit/p/7287118.html
Copyright © 2011-2022 走看看