数格子
题目大意
数据范围
题解
这题就是变式的多米诺骨牌,仔细想想就很简单了。
设
F
[
由于
N
最大为
Code(Pascal)
var
n,m,o,p:int64;
jz,f,kk,new:array[0..15,0..15] of int64;
procedure makejz; //转移矩阵
begin
jz[0,15]:=1; jz[1,14]:=1;
jz[2,13]:=1; jz[4,11]:=1;
jz[8,7]:=1; jz[3,12]:=1;
jz[3,15]:=1; jz[5,10]:=1;
jz[10,5]:=1; jz[6,15]:=1;
jz[6,9]:=1; jz[7,14]:=1;
jz[7,11]:=1; jz[7,8]:=1;
jz[9,6]:=1; jz[11,4]:=1;
jz[11,7]:=1; jz[12,15]:=1;
jz[12,3]:=1; jz[13,14]:=1;
jz[13,2]:=1; jz[14,1]:=1;
jz[14,7]:=1; jz[14,13]:=1;
jz[15,0]:=1; jz[15,15]:=1;
jz[15,3]:=1; jz[15,12]:=1;
jz[15,6]:=1;
end;
procedure lj;
var
i,l,j:longint;
begin
for i:=0 to 15 do
for l:=0 to 15 do
begin
new[i,l]:=0;
for j:=0 to 15 do
new[i,l]:=(new[i,l]+f[i,j]*kk[j,l]) mod m;
end;
f:=new;
end;
procedure xc;
var
i,l,j:longint;
begin
for i:=0 to 15 do
for l:=0 to 15 do
begin
new[i,l]:=0;
for j:=0 to 15 do
new[i,l]:=(new[i,l]+kk[i,j]*kk[j,l]) mod m;
end;
kk:=new;
end;
procedure ksm(o:longint);
begin
while o>0 do
begin
if o mod 2=1 then lj;
o:=o div 2;
xc;
end;
end;
begin
makejz;
while 0=0 do
begin
readln(n,m);
if (n=0) and (m=0) then exit;
if n=1 then writeln(1)
else
begin
f:=jz;
kk:=jz;
ksm(n-1);
writeln(f[15,15]);
end;
end;
end.