分析:
当n=1时ans=4=f(5)-1;
n=2,ans=12=f(7)-1;
n=3,ans=33=f(9)-1;
于是大胆猜想ans=f(2*k+3)-1。
之后用矩阵快速幂求解f(n)即可,O(logn)。
AC code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef vector<ll> vec; 5 typedef vector<vec> mat; 6 const ll M=998244353; 7 mat mul(mat& A,mat& B) 8 { 9 mat C(A.size(),vec(B[0].size())); 10 for(int i=0;i<A.size();i++) 11 for(int k=0;k<B.size();k++) 12 for(int j=0;j<B[0].size();j++) 13 C[i][j]=(C[i][j]+A[i][k]*B[k][j]) % M; 14 return C; 15 } 16 mat pow(mat A,ll n) 17 { 18 mat B(A.size(),vec(A.size())); 19 for(int i=0;i<A.size();i++) B[i][i]=1; 20 while(n) 21 { 22 if(n&1) B=mul(B,A); 23 A=mul(A,A); 24 n>>=1; 25 } 26 return B; 27 } 28 int main() 29 { 30 //freopen("input.txt","r",stdin); 31 ll k; 32 while(~scanf("%lld",&k)) 33 { 34 mat A(2,vec(2)); 35 A[0][0]=1;A[0][1]=1; 36 A[1][0]=1;A[1][1]=0; 37 A=pow(A,2*k+3); 38 printf("%lld\n",A[1][0]-1); 39 } 40 return 0; 41 }
原文地址:https://www.cnblogs.com/cautx/p/11455746.html
时间: 2024-10-12 02:49:01