• HDOJ 1757 A Simple Math Problem


    矩阵连乘+递归形式的快速幂

    盗用一张图:

    把问题转化为求矩阵的n-9次幂就行了;

    A Simple Math Problem

    Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
    Total Submission(s) : 4   Accepted Submission(s) : 2
    Problem Description
    Lele now is thinking about a simple function f(x).

    If x < 10 f(x) = x.
    If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10);
    And ai(0<=i<=9) can only be 0 or 1 .

    Now, I will give a0 ~ a9 and two positive integers k and m ,and could you help Lele to caculate f(k)%m.
     


    Input
    The problem contains mutiple test cases.Please process to the end of file.
    In each case, there will be two lines.
    In the first line , there are two positive integers k and m. ( k<2*10^9 , m < 10^5 )
    In the second line , there are ten integers represent a0 ~ a9.
     


    Output
    For each case, output f(k) % m in one line.
     


    Sample Input
    10 9999
    1 1 1 1 1 1 1 1 1 1
    20 500
    1 0 1 0 1 0 1 0 1 0
     


    Sample Output
    45
    104
     


    Author
    linle
     


    Source
    2007省赛集训队练习赛(6)_linle专场
     
     1 #include<cstdio>
     2 #include<cstring>
     3 const int N=10;
     4 using namespace std;
     5 int k,m;
     6 
     7 struct Matrix
     8 {
     9     int map[N][N];
    10 };
    11 
    12 Matrix matrix;
    13 
    14 void init()
    15 {
    16      for(int i=0;i<N;i++)
    17      {
    18          scanf("%d",&matrix.map[0][i]);
    19      }
    20      for(int i=1;i<N;i++)
    21      {
    22          for(int j=0;j<N;j++)
    23          {
    24              if(i==(j+1))matrix.map[i][j]=1;
    25              else matrix.map[i][j]=0;
    26          }
    27      }
    28 }
    29 
    30 Matrix mul(Matrix a,Matrix b)
    31 {
    32      Matrix c;
    33      for(int i=0;i<N;i++)
    34     {
    35          for(int j=0;j<N;j++)
    36         {
    37              c.map[i][j]=0;
    38              for(int k=0;k<N;k++)
    39              {
    40                  c.map[i][j]+=a.map[i][k]*b.map[k][j];
    41              }
    42              c.map[i][j]%=m;
    43          }
    44      }
    45      return c;
    46  }
    47 
    48  Matrix quickpow(int k)
    49  {
    50      if(k==1)  return matrix;
    51      if(k&1) return mul(matrix,quickpow(k-1));
    52      else
    53      {
    54          Matrix temp=quickpow(k>>1);
    55          return mul(temp,temp);
    56      }
    57  }
    58 
    59  int main()
    60  {
    61      while(scanf("%d%d",&k,&m)!=EOF)
    62      {
    63          init();
    64          if(k<10)
    65          {
    66              printf("%d\n",k%m);
    67              continue;
    68          }
    69          Matrix temp=quickpow(k-9);
    70          int ans=0;
    71          for(int i=0;i<N;i++)
    72          {
    73              ans+=temp.map[0][i]*(N-i-1);
    74              ans%=m;
    75          }
    76          printf("%d\n",ans);
    77      }
    78      return 0;
    79  }
  • 相关阅读:
    交互式shell和非交互式shell、登录shell和非登录shell的区别
    cocos2d-x入门笔记(1)
    《你的知识需要管理》读后感悟以及笔记
    Qt入门之信号与槽机制
    《程序员的思维修炼》读书笔记以及感悟
    Py邮件
    2018-2019 20165226 Exp9 Web安全基础
    2018-2019 20165226 Exp 8 Web基础
    2018-2019 20165226 Exp7 网络欺诈防范
    2018-2019 20165226 Exp6 信息搜集与漏洞扫描
  • 原文地址:https://www.cnblogs.com/CKboss/p/3078323.html
Copyright © 2020-2023  润新知