zoukankan      html  css  js  c++  java
  • 矩阵快速幂

    用vector:

     1 typedef vector<ll> vec;
     2 typedef vector<vec> mat;
     3 map<ll,ll> mp;
     4 mat mul(mat &A, mat &B) {
     5     mat C(A.size(), vec(B[0].size()));
     6     for(int i = 0; i < A.size(); i ++) {
     7         for(int j = 0; j < B[0].size(); j ++) {
     8             for(int k = 0; k < B.size(); k ++) {
     9                 C[i][j] = (C[i][j] + A[i][k]*B[k][j]);
    10             }
    11             C[i][j] %= mod;
    12         }
    13     }
    14     return C;
    15 }
    16 
    17 mat pow(mat A, ll n) {
    18     mat B(A.size(), vec(A[0].size()));
    19     for(int i = 0; i < B.size(); i ++) B[i][i] = 1;
    20     while(n) {
    21         if(n&1LL) B = mul(B,A);
    22         A = mul(A, A);
    23         n >>= 1LL;
    24     }
    25     return B;
    26 }

    用结构体,速度比vector快。

     1 int len;
     2 struct mat{
     3     ll m[len][len];
     4     Nod(){
     5         memset(m, 0, sizeof(m));
     6     }
     7 };
     8 mat mul(mat &A, mat &B) {
     9     mat C;
    10     for(int i = 0; i < len; i ++) {
    11         for(int j = 0; j < len; j ++) {
    12             for(int k = 0; k < len; k ++) {
    13                 C.m[i][j] = (C.m[i][j] + A.m[i][k]*B.m[k][j]) % mod;
    14             }
    15         }
    16     }
    17     return C;
    18 }
    19 
    20 mat pow(mat A, ll n) {
    21     mat B;
    22     for(int i = 0; i < len; i ++) B.m[i][i] = 1;
    23     while(n) {
    24         if(n&1LL) B = mul(B,A);
    25         A = mul(A, A);
    26         n >>= 1LL;
    27     }
    28     return B;
    29 }

    同一个题目,左边是用结构体算出来的时间,右边是用vector算出来的时间。

  • 相关阅读:
    反反爬 | 如何巧过 CloudFlare 5秒盾?
    Xpath高级用法
    GZIP 头解析
    学习S5
    Chrome 建立SOCKS5代理
    建立IP6隧道
    linux 配置Socks51
    linux 配置Socks5
    最近买了一个域名 哈哈,棒棒哒~~
    jquery 动态添加下拉框 需要增加 煊染 selectmenu("refresh");
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/8999597.html
Copyright © 2011-2022 走看看