HDU 6186 number number number 【规律+矩阵快速幂】

题目链接:

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

 题目思路:

枚举出前三个值,分别为4,12,33.

可以发现其对应的值是斐波那契数列对应的2*i+3项-1

所以利用矩阵快速幂求第2*i+3项,将值减一输出即可。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int NUM=5;
 5 const int mod=998244353;
 6 struct Mat{
 7     int n,m;
 8     ll a[NUM][NUM];
 9 };
10 Mat mul(Mat a,Mat b)
11 {
12     Mat ans;
13     ans.n=a.n;
14     ans.m=b.m;
15     for(int i=0;i<ans.n;++i)
16     for(int j=0;j<ans.m;++j){
17         ans.a[i][j]=0;
18         for(int k=0;k<a.m;++k){
19             ans.a[i][j]+=(a.a[i][k]*b.a[k][j])%mod;
20             ans.a[i][j]%=mod;
21         }
22     }
23     return ans;
24 }
25 Mat power(Mat a,int num)
26 {
27     Mat ans;
28     ans.n=2;
29     ans.m=1;
30     ans.a[0][0]=ans.a[1][0]=1;
31     while(num)
32     {
33         if(num&1)
34             ans=mul(ans,a);
35         num>>=1;
36         a=mul(a,a);
37     }
38     return ans;
39 }
40 int main()
41 {
42     //freopen("data.txt","r",stdin);
43     //freopen("out1.txt","w",stdout);
44     ios::sync_with_stdio(false);
45     int n;
46     Mat a;
47     a.n=a.m=2;
48     a.a[0][0]=0;
49     a.a[0][1]=a.a[1][0]=a.a[1][1]=1;
50     while(cin>>n)
51     {
52         Mat ans=power(a,n*2+3);
53         cout<<((ans.a[0][1]-1)%mod+mod)%mod<<endl;
54     }
55     return 0;
56 }

 

posted @ 2017-10-17 19:59  SCaryon  阅读(230)  评论(0编辑  收藏  举报