#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
int mod;
int a[4][4]={
{ 1, 1, 1, 1},
{ 1, 1, 0, 0},
{-1, 0,-1, 0},
{-1, 0, 0, 0}
};
struct matrix{
int f[4][4];
};
matrix mul(matrix a,matrix b)
{
matrix c;
memset(c.f,0,sizeof(c.f));
int i,j,k;
for(k=0;k<4;k++)
{
for(i=0;i<4;i++)
{
if(!a.f[i][k])continue;
for(j=0;j<4;j++)
{
if(!b.f[k][j])continue;
c.f[i][j]=(c.f[i][j]+a.f[i][k]*b.f[k][j])%mod;
}
}
}
return c;
}
matrix pow_mod(matrix a,int b)
{
matrix s;
int i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
s.f[i][j]=(i==j?1:0);
while(b)
{
if(b&1)
s=mul(s,a);
a=mul(a,a);
b=b>>1;
}
return s;
}
int main()
{
int n;
while(cin>>n>>mod)
{
if(n==0)
{
cout<<0<<endl;
continue;
}
matrix e;
int i,j;
memcpy(e.f,a,sizeof(a));
/*for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
cout<<e.f[i][j]<<" ";
cout<<endl;
}*/
e=pow_mod(e,n-1);
int ans=0;
ans=(e.f[0][0]+e.f[1][0]+e.f[0][1]+e.f[1][1])%mod;
cout<<(ans+mod)%mod<<endl;//ans会出现负的
}
return 0;
}
/*
矩阵状态,f[i][j]表示长度为i的以j结尾不是O-queue的方案数(j=f,m,ff,fm)
f m ff fm
f | 1 1 1 1|
m | 1 1 0 0|
ff |-1 0 -1 0|
fm |-1 0 0 0|
f[i][f]=f[i-1][f]+f[i-1][m]-f[i-1][ff]-f[i-1][fm],要减去以ff和fm结尾的,因为不能出现fff,fmf
*/
hdu 2604 Queuing 矩阵
最新推荐文章于 2019-05-27 21:29:56 发布