题目

image-1670856298788

题解

[fn,fn+1,sn]*A=f[n+1,fn+2,sn+1]
其中A={
{0,1,0},
{1,1,1},
{0,0,1}
}

#include<iostream>
#include<cstring>
using namespace std;
const int N=3;
int n,m;
void mult(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]+(long long)a[j]*b[j][i])%m;
        }
    }
    memcpy(c,temp,sizeof temp);
}
void mult(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]+(long long)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)mult(f,f,A);//f1,f2,s1
        mult(A,A,A);
        n>>=1;
    }
    cout<<f[2]<<endl;
    return 0;
}

`