分析
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a209d660ec2aa35738926a4df3585b72.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4ab89a07b2aa2c43498b2ed6d42eaa8e.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/678c2cc5793a483da24e115455435d7d.png)
代码
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long ll;
const int N=3;
int n,m;
void mul(int c[],int a[],int b[][N]){
int temp[N]={0};
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
temp[i]=(temp[i]+(ll)a[j]*b[j][i])%m;
}
}
memcpy(c,temp,sizeof temp);
}
void mul(int c[][N],int a[][N],int b[][N]){
int temp[N][N]={0};
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
for(int k=0;k<N;k++)
temp[i][j]=(temp[i][j]+(ll)a[i][k]*b[k][j])%m;
memcpy(c,temp,sizeof temp);
}
int main(){
cin >> n >> m;
int f[N]={1,1,1};
int a[N][N]={
{0,1,0},
{1,1,1},
{0,0,1}
};
n--;
while(n){
if(n&1)mul(f,f,a);
mul(a,a,a);
n >>= 1;
}
cout << f[2];
}