第十场 hdu 6172 Array Challenge(矩阵快速幂)

Posted Wally的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十场 hdu 6172 Array Challenge(矩阵快速幂)相关的知识,希望对你有一定的参考价值。

http://acm.hdu.edu.cn/showproblem.php?pid=6172

 

题目大意:按照给出的公式算出an

 

解题思路:an=4an-1+17an-2-12an-3,不要问我为什么,我也不知道(?_?)

 

AC代码:

技术分享
 1 #include <iostream>
 2 #include<bits/stdc++.h>
 3 //if(~i)//当i不是-1时满足条件
 4 using namespace std;
 5 const int SMod=1e9+7;
 6 struct Matrix
 7 {
 8     long long m[4][4];
 9 };
10 Matrix Mul(Matrix a,Matrix b)
11 {
12     Matrix c;
13     memset(c.m,0,sizeof(c.m));
14     for(int i=0;i<4;i++)
15         for(int j=0;j<4;j++)
16             for(int k=0;k<4;k++)
17                 c.m[i][j]+=((a.m[i][k]*b.m[k][j])%SMod+SMod)%SMod;
18     return c;
19 }
20 
21 Matrix fastm(Matrix a,long long n)
22 {
23     Matrix res;
24     memset(res.m,0,sizeof(res.m));
25     for(int i=0;i<4;i++)
26     res.m[i][i]=1;
27     while(n)
28     {
29         if(n&1)
30         res=Mul(res,a);
31         n>>=1;
32         a=Mul(a,a);
33     }
34     return res;
35 }
36 int main()
37 {
38     Matrix a,ans;
39     memset(a.m,0,sizeof(a.m));
40     a.m[0][0]=4,a.m[0][1]=17,a.m[0][2]=-12;
41     a.m[1][0]=1,a.m[2][1]=1;
42     long long t,n;
43     scanf("%lld",&t);
44     while(t--)
45     {
46         scanf("%lld",&n);
47         if(n==2) printf("31\n");
48         else if(n==3) printf("197\n");
49         else if(n==4) printf("1255\n");
50         else
51         {
52             ans=fastm(a,n-4);
53             printf("%lld\n",(ans.m[0][0]*1255%SMod+SMod+ans.m[0][1]*197%SMod+SMod+ans.m[0][2]*31%SMod+SMod)%SMod);
54         }
55     }
56     return 0;
57 }
View Code

 

]????

以上是关于第十场 hdu 6172 Array Challenge(矩阵快速幂)的主要内容,如果未能解决你的问题,请参考以下文章

第十场 hdu 6178 (bfs)

2018多校第十场 HDU 6430 线段树合并

第十场 hdu 6171 Admiral(双向bfs找交点)

2017多校第10场 HDU 6172 Array Challenge 猜公式,矩阵幂

HDU - 6172:Array Challenge (BM线性递推)

郑州大学2018新生训练赛第十场题解