• ans=0; 
    •    
      for(i=1;i<=n;i++) 
    •  
          { 
    •  
            if(i&1)ans=(ans*2+1)%m; 
    •  
            else ans=ans*2%m; 
    •  
          } 
 
  使用矩阵快速幂计算 f[n ]


   f[n] = f[n-1]+f[n-2]*2 +1

  { f[n] ,f[n-1] ,1 } = { f[n-1] ,f[ n- 2] ,1 } * { {1,2,1} ,{0,1 ,0} ,{0,0,1} }

#include <iostream>
 #include <cmath>
 #include <algorithm>
 using namespace std; 
 #define N 5
  int mod;
 
 #define int long long
  struct matrix {
  	int a[N+2][N+2];
  };
  int n;
  matrix m1; 
  
  void init_e(matrix &x){
  	
  	int i,j;
  	for(i=1;i<=3;i++)
  	 for(j=1;j<=3;j++) {
  	 	 x.a[i][j]=0;
  	 	 if(i==j) x.a[i][j]=1;
  	 }
  }
  matrix mul(matrix &x,matrix &y){
 	int i,j,k;
 	matrix z;
 	
 	for(i=1;i<=3;i++)
 	 for(j=1;j<=3;j++){
 	 	z.a[i][j]=0;
 	 	for(k=1;k<=3;k++)
 	 	 z.a[i][j]+=x.a[i][k]*y.a[k][j], z.a[i][j]%=mod;
 	 }
 	
 	return z;
 }
   matrix ksm(matrix &x,int k){
 	matrix tmp=x, ans;
 	init_e(ans);
 	
 	while(k){
 		if(k&1) ans=mul(ans,tmp);
 		
 		tmp=mul(tmp,tmp); 
 		k/=2;
 	}
 	return ans;
 }
 
  signed main(){
 	std::ios::sync_with_stdio(0);
 	
 	while(cin>>n>>mod){
 		
	 	m1.a[1][1]=1,m1.a[1][2]=2,m1.a[1][3]=1;
	 	m1.a[2][1]=1,m1.a[2][2]=0,m1.a[2][3]=0;
	 	m1.a[3][1]=0,m1.a[3][2]=0,m1.a[3][3]=1;
	 	
	 	matrix ans =ksm(m1,n-1);
	 	cout<<(ans.a[1][1]*1+ans.a[1][2]*0+
	 	ans.a[1][3]*1)%mod;
	 	
	 	cout<<endl;
 	}
  }	
 
 

 



posted on 2023-02-26 14:35  towboat  阅读(21)  评论(0)    收藏  举报