• HDU 1757 A Simple Math Problem(矩阵快速幂模板)


    题意:
    题意很简单,不多说了。

    思路:

    |f(10) |       |a0 a1 a2 ...a8 a9|    |f(9)|
    | f(9)  |       | 1   0   0 ... 0    0 |    |f(8)|
    | .....  |   =  | ..    ...    ...   ...    |     | ..   |
    | f(2) |        | 0   0   0 ... 0    0|     |f(1)|
    | f(1) |   | 0   0   0 ... 1    0|     |f(0)|

    为自己留个模板。

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<sstream>
     6 #include<vector>
     7 #include<stack>
     8 #include<queue>
     9 #include<cmath>
    10 #include<map>
    11 #include<set>
    12 using namespace std;
    13 typedef long long ll;
    14 typedef pair<int,int> pll;
    15 const int INF = 0x3f3f3f3f;
    16 const int maxn = 1000 + 5;
    17 
    18 int n,m;
    19 
    20 struct Matrix
    21 {
    22     int mat[12][12];
    23     Matrix operator *(Matrix a)
    24     {
    25         Matrix c;
    26         for(int i=0;i<10;i++)
    27         {
    28             for(int j=0;j<10;j++)
    29             {
    30                 c.mat[i][j]=0;
    31                 for(int k=0;k<10;k++)
    32                 {
    33                     c.mat[i][j]+=(mat[i][k]*a.mat[k][j])%m;
    34                     c.mat[i][j]%=m;
    35                 }
    36             }
    37         }
    38         return c;
    39     }
    40 };
    41 
    42 Matrix base, ans;
    43 
    44 void init()
    45 {
    46     for(int i=0;i<10;i++)
    47     for(int j=0;j<10;j++)
    48     {
    49         if(i==j) ans.mat[i][j]=1;
    50         else ans.mat[i][j]=0;
    51         if(i-1==j) base.mat[i][j]=1;
    52         else base.mat[i][j]=0;
    53     }
    54 }
    55 
    56 void pow(int n)
    57 {
    58     while(n)
    59     {
    60         if(n&1)  ans=ans*base;
    61         base=base*base;
    62         n>>=1;
    63     }
    64 }
    65 
    66 int main()
    67 {
    68     //freopen("in.txt","r",stdin);
    69     while(~scanf("%d%d",&n,&m))
    70     {
    71         init();
    72         for(int i=0;i<10;i++)  scanf("%d",&base.mat[0][i]);
    73         if(n<10)  {printf("%d
    ",n%m);continue;}
    74         pow(n-9);
    75         int sum=0;
    76         for(int i=0;i<10;i++)  sum=(sum+ans.mat[0][i]*(9-i))%m;
    77         printf("%d
    ",sum);
    78     }
    79     return 0;
    80 }
  • 相关阅读:
    转:// 再说 Oracle RAC services
    rman 脚本大全
    转://oracle 重新编译用户无效对象
    转://oracle 11G+ASM for Linux手工建库
    转://oracle字符集
    Linux下Oracle client客户端安装
    反对称串问题
    C#写鞍点问题
    每周进度条(第十六周)
    每周进度条(第十五周)
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/7267066.html
Copyright © 2020-2023  润新知