使用矩阵快速幂计算 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;
}
}