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 }