今天来机房。。看到他们在讨论**题,就凑了个热闹=w=
然后就第一个写出来了=w=
这道题我们可以写成这样的转移:
F[I]:=F[I-1]*10^K+I
K最多18次
我们就做18次就可以了..然后我们稍微推一推就能知道发现
原矩阵是1*3的矩阵.,用F表示
转移矩阵是3*3的矩阵,用G表示
F的初始状态是1(每次I增加1) 0(I目前是0) 0(答案)
G是
1 1 1
0 1 1
0 0 10^k
这个自己算算就晓得了=w=
然后就不停的做= - =
每次做10^k-10^(k-1)次方
做到N为止。细节自己推一推啦啦啦啦啦啦=w=
code(pascal)
略丑QAQ
var
t,k,n,m,p,tmp:int64;
i,j,a,b,c:longint;
g,f,y,e:array[0..4,0..4] of int64;
flag:boolean;
begin
read(n,m);
f[1,1]:=1;f[1,2]:=0;f[1,3]:=0;
k:=1;
for i:=1 to 18 do
begin
k:=k*10;
fillchar(g,sizeof(g),0);
g[1,1]:=1;g[1,2]:=1;g[1,3]:=1;
g[2,2]:=1;g[2,3]:=1;g[3,3]:=(k mod m);
t:=k-1;
fillchar(y,sizeof(y),0);
for j:=1 to 3 do
y[j,j]:=1;
if t<=n then p:=k-(k div 10) else begin p:=n-(k div 10)+1;flag:=true;end;
while p<>0 do
begin
if (p mod 2)=1 then
begin
fillchar(e,sizeof(e),0);
for a:=1 to 3 do
for b:=1 to 3 do
for c:=1 to 3 do
begin
tmp:=(y[a,b]*g[b,c]) mod m;
tmp:=(e[a,c]+tmp) mod m;
e[a,c]:=(tmp) mod m;
end;
for a:=1 to 3 do
for b:=1 to 3 do
y[a,b]:=(e[a,b]) mod m;
end;
fillchar(e,sizeof(e),0);
for a:=1 to 3 do
for b:=1 to 3 do
for c:=1 to 3 do
begin
tmp:=(g[a,b]*g[b,c]) mod m;
tmp:=(e[a,c]+tmp) mod m;
e[a,c]:=tmp;
end;
for a:=1 to 3 do
for b:=1 to 3 do
g[a,b]:=e[a,b];
p:=p div 2;
end;
fillchar(e,sizeof(e),0);
for a:=1 to 3 do
for b:=1 to 3 do
begin
tmp:=(f[1,a]*y[a,b]) mod m;
tmp:=(tmp+e[1,b]) mod m;
e[1,b]:=tmp;
end;
for a:=1 to 3 do
f[1,a]:=e[1,a];
if flag then break;
end;
writeln(f[1,3]);
end.