2326: [HNOI2011]数学作业 - BZOJ

时间:2023-03-08 17:54:30

2326: [HNOI2011]数学作业 - BZOJ

首先是DP,分段DP(按位数讨论)

然后每一段构造出它对应的矩阵,用矩阵快速幂加速

 type
matrix=array[..,..]of int64;
var
n,m:int64;
a,b,c,d:matrix; function min(x,y:int64):int64;
begin
if x<y then exit(x);
exit(y);
end; procedure cheng(var a,b:matrix);
var
i,j,k:longint;
begin
for i:= to do
for j:= to do
d[i,j]:=;
for i:= to do
for j:= to do
for k:= to do
d[i,j]:=(d[i,j]+a[i,k]*b[k,j])mod m;
a:=d;
end; procedure main;
var
k,s:int64;
i:longint;
begin
read(n,m);
for i:= to do
a[i,i]:=;
b[,]:=;
b[,]:=;
b[,]:=;
b[,]:=;
k:=;
while n>=k do
begin
b[,]:=(k*)mod m;
c:=b;
s:=min(n,k*-)-k+;
while s> do
begin
if s and = then cheng(a,c);
cheng(c,c);
s:=s>>;
end;
k:=k*;
end;
write((a[,]+a[,])mod m);
end; begin
main;
end.