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

Posted 谦谦君子,陌上其华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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",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\n",sum);
78     }
79     return 0;
80 }

 

以上是关于HDU 1757 A Simple Math Problem(矩阵快速幂模板)的主要内容,如果未能解决你的问题,请参考以下文章

hdu1757 A Simple Math Problem

hdu 1757 A Simple Math Problem 矩阵快速幂

hdu-1757 A Simple Math Problem---矩阵快速幂模板题

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

HDU - 1757 A Simple Math Problem (矩阵快速幂)

hdu 1757 A Simple Math Problem (构造矩阵解决递推式问题)