zoukankan      html  css  js  c++  java
  • 【洛谷 P1707】 刷题比赛 (矩阵加速)

    题目连接
    很久没写矩阵加速了,复习一下,没想到是一道小毒瘤题。

    状态矩阵(a[k],b[k],c[k],a[k+1],b[k+1],c[k+1],k,k^2,w^k,z^k,1)
    转移矩阵

      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
      0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
      0, q, 0, 0, p, 1, 1, t, r, 0, 0, 1,
      0, 0, v, 0, 1, u, 1, 0, 0, 1, 0, 0,
      0, 0, 0, y, 1, 1, x, 1, 0, 0, 1, 2,
      0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1,
      0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 1,
      0, 0, 0, 0, 0, 0, 0, 0, 0, w, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, z, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
    

    手写不易。

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    // a[k],b[k],c[k],a[k+1],b[k+1],c[k+1],k,k^2,w^k,z^k,1
    int u, v, p, q, r, t, x, w, z, y;
    typedef long long ll;
    ll n, k;
    ll f[12], tmp[12], temp[12][12], dp[12][12];
    inline ll Slow_Mul(ll a, ll b){
        ll ans = 0;
        while(b){
          if(b & 1) ans = (ans + a) % k;
          b >>= 1;
          a = (a + a) % k;
        }
        return ans;
    }
    inline void Mult(){
        for(int i = 1; i <= 11; ++i){
           tmp[i] = 0;
           for(int j = 1; j <= 11; ++j)
              (tmp[i] += Slow_Mul(f[j], dp[i][j])) %= k;
        }
        for(int i = 1; i <= 11; ++i)
           f[i] = tmp[i];
    }
    inline void Self(){
        for(int i = 1; i <= 11; ++i)
           for(int j = 1; j <= 11; ++j){
              temp[i][j] = 0;
              for(int l = 1; l <= 11; ++l)
                 (temp[i][j] += Slow_Mul(dp[i][l], dp[l][j])) %= k;
           }
        for(int i = 1; i <= 11; ++i)
           for(int j = 1; j <= 11; ++j)
              dp[i][j] = temp[i][j];
    }
    inline void Fast_Pow(){
        n -= 2;
        while(n){
          if(n & 1) Mult();
          n >>= 1;
          Self();
        }
    }
    int main(){
        scanf("%lld%lld%d%d%d%d%d%d%d%d%d%d", &n, &k, &p, &q, &r, &t, &u, &v, &w, &x, &y, &z);
        ll xs[12][12] = 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
      0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
      0, q, 0, 0, p, 1, 1, t, r, 0, 0, 1,
      0, 0, v, 0, 1, u, 1, 0, 0, 1, 0, 0,
      0, 0, 0, y, 1, 1, x, 1, 0, 0, 1, 2,
      0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1,
      0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 1,
      0, 0, 0, 0, 0, 0, 0, 0, 0, w, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, z, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
    };
        memcpy(dp, xs, sizeof dp);
        f[1] = f[2] = f[3] = f[11] = 1; f[4] = f[5] = f[6] = 3; f[9] = w; f[10] = z; f[7] = 1; f[8] = 1;
        Fast_Pow();
        printf("nodgd %lld
    Ciocio %lld
    Nicole %lld
    ", f[4], f[5], f[6]);
        return 0;
    }
    
    
  • 相关阅读:
    [分治FFT]「CTSC2018」青蕈领主
    [边分治+线段树合并]「CTSC2018」暴力写挂
    [模板]MTT
    [模板]NTT
    [矩阵求逆+二分图匹配]BZOJ 3168 [Heoi2013]钙铁锌硒维生素
    [BZOJ1925][SDOI2010]地精部落(DP)
    [BZOJ1047][HAOI2007]理想的正方形(RMQ+DP)
    [POJ3630]Phone List (Tire)
    [POJ1193][NOI1999]内存分配(链表+模拟)
    [POJ2823]Sliding Window 滑动窗口(单调队列)
  • 原文地址:https://www.cnblogs.com/Qihoo360/p/9790216.html
Copyright © 2011-2022 走看看