第一次写状态压缩,一开始没看懂状态怎么表示的,跟lyc一起琢磨了好久才弄明白。题目比较容易,注意m=1的情况就ok了。
ACcode:
#include<cstdio>
#include<cstring>
typedef long long LL;
const int NS=16;
int n,m;
int a[NS][NS],b[NS][NS],c[NS][NS],t[NS][NS];
void dfs(int now,int pre,int pos) //构建从now状态到pre状态的可达矩阵
{
if (pos>4) return ;
if (pos==4)
{
c[now][pre]++;
return ;
}
if ((1<<pos)&pre) dfs(now,pre,pos+1);
else
{
dfs(now|(1<<pos),pre,pos+1);
if ((pre|(1<<(pos+1)))!=pre)
dfs(now,pre,pos+2);
}
}
void mul(int x[][NS],int y[][NS])
{
memset(t,0,sizeof(t));
for (int i=0;i<NS;i++)
for (int j=0;j<NS;j++)
for (int k=0;k<NS;k++)
t[i][j]+=((LL)x[i][k]*y[k][j])%m,
t[i][j]%=m;
memcpy(x,t,sizeof(t));
}
void solve(int r)
{
memcpy(a,c,sizeof(c));
memcpy(b,c,sizeof(c));
while (r>0)
{
if (r&1) mul(a,b);
mul(b,b);
r>>=1;
}
}
int main()
{
for (int i=0;i<NS;i++)
dfs(0,i,0);
while (scanf("%d%d",&n,&m),n|m)
{
solve(n-1);
printf("%d\n",a[0][0]%m);
}
return 0;
}