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;
    }
    
    
  • 相关阅读:
    汉语-词语-从容:百科
    汉语-词语-伶俜:百科
    汉语-词语-心迹:百科
    汉语-词语-痛楚:百科
    汉语-词语-痛苦:百科
    汉语-词语:散步
    汉语-词语-憎恨:百科
    2455 繁忙的都市
    P2820 局域网
    NOIP2013Day1T3 表示只能过一个点
  • 原文地址:https://www.cnblogs.com/Qihoo360/p/9790216.html
Copyright © 2011-2022 走看看