• UVa10870 Recurrences


    列出方程组:

    a1*f(n-1)+a2*f(n-2)+a3*f(n-3)+...+ad*f(n-d)=f(n)

         f(n-1)                                                    =f(n-1)

                         f(n-2)                                    =f(n-2)

                                         f(n-3)                    =f(n-3)

                                                             f(n-d)=f(n-d)


    解线性方程组, 转化成矩阵形式:

    A                   ×                         F(n-1)    = F(n)

    a1 a2 a3 ... ad
    1        
      1      
        1    
          ... 1
    f(n-1)
    f(n-2)
    f(n-3)
    ...
    f(n-d)
    f(n)
    f(n-1)
    f(n-2)
    ...
    f(n-d)



    递推:

    A × F(n-1) = F(n)

    A × F(n-2) = F(n-1)

    A × F(n-3) = F(n-2)

    ...

    得出:

    An-d  × F(d) = F(n)

    其中F(d)为:

    f(d)
    f(d-1)
    f(d-2)
    ...
    f(1)

    剩下就是求矩阵A的n-d次幂,以及求矩阵与向量的乘,F(n)中的f(n)为所求~

    void matrix_mul(Matrix A, Matrix B, Matrix res) {                                              
      Matrix C;
      memset(C, 0, sizeof(C));                                                                     
      for(int i = 0; i < sz; ++i)
        for(int j = 0; j < sz; ++j)                                                                
          for(int k = 0; k < sz; ++k ) C[i][j] = (C[i][j] + A[i][k]*B[k][j]) % mod;                
      memcpy(res, C, sizeof(C));
    }   
    void matrix_pow(Matrix A, int n, Matrix res) {                                                 
      Matrix a, r;                                                                                 
      memcpy(a, A, sizeof(a));                                                                     
      memset(r, 0, sizeof(r));                                                                     
      for(int i = 0; i < sz; ++i) r[i][i] = 1;                                                     
      while(n) {
        if(n&1) matrix_mul(r, a, r);                                                               
        n >>= 1;
        matrix_mul(a, a, a);
      } 
      memcpy(res, r, sizeof(r));                                                                   
    }   

    注意一下这个:

    typedef i64 Matrix[maxn][maxn];
    typedef i64 Vector[maxn];
  • 相关阅读:
    [NOI2007]生成树计数
    [NOI2009]变换序列
    BZOJ3261 最大异或和
    [SHOI2011]双倍回文
    [TopCoder14647]HiddenRabbits
    [HDU5709]Claris Loves Painting
    [BZOJ4559][JLOI2016]成绩比较
    [CF995F]Cowmpany Cowmpensation
    [TopCoder11557]MatrixPower
    [UOJ198][CTSC2016]时空旅行
  • 原文地址:https://www.cnblogs.com/Accoral/p/3161332.html
Copyright © 2020-2023  润新知