分析
矩阵递推式;
Sn=1*Sn-1+1*fn+0*fn-1;
fn+1=0*Sn-1+1*fn+1*fn-1;
fn=0*Sn-1+1*fn+0*fn-1;
{1 1 0}
{0 1 1}
{0 1 0}
其余见上一片blog
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll m,n;
struct mat{ll a[5][5];}ans;
mat mul(mat &x,mat &y){
mat c;
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
c.a[i][j]=0;
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
for(int k=1;k<=3;k++)
c.a[i][j]=(c.a[i][j]+x.a[i][k]*y.a[k][j]%m)%m;
return c;
}
mat x;
void pow(ll n){
while(n){
if(n&1)ans=mul(ans,x);
x=mul(x,x);
n=n>>1;
}
}
int main(){
scanf("%lld%lld",&n,&m);
ans.a[1][1]=ans.a[2][2]=ans.a[3][3]=1;
x.a[1][1]=1;x.a[1][2]=1;x.a[1][3]=0;
x.a[2][1]=0;x.a[2][2]=1;x.a[2][3]=1;
x.a[3][1]=0;x.a[3][2]=1;x.a[3][3]=0;
pow(n-1);
ll p=ans.a[1][1]+ans.a[1][2]+ans.a[1][3];
printf("%lld",p%m);
return 0;
}