今天在这道题目上吃苦头了
主要是过去一直用的快排今天严重超时了
从今往后要用下面这种快排了:
procedure qsort(fp,rp:longint);
var i,j,k:longint;
x,tmp:rec;
begin
x:=data[(fp+rp)div 2];
i:=fp;j:=rp;
repeat
while (data[j].l>x.l) do dec(j);
while (data.l<x.l) do inc(i);
if i<=j then begin tmp:=data;data:=data[j];data[j]:=tmp;inc(i);dec(j);end;
until i>j;
if fp<j then qsort(fp,j);
if i<rp then qsort(i,rp);
end;
|
这个题大致思路是不停的除5;把5都剔出来最后一起乘
但这个程序的那个系数实在不知道怎么推出来的,先把它背下来吧:
const tail:array[ 0..9 ]of integer=(6,6,2,6,4,4,4,8,4,6);
var i,j,k:longint;
five,ans:longint;
a:array[ 0..100 ]of integer;
l:longint;
s:string;
begin
repeat
readln(s);l:=length(s)-1;
for i:=0 to l do a[ i ]:=ord(s[ l-i+1 ])-ord('0');
while (a[ l ]=0) and (l>0) do dec(l);
five:=0;ans:=1;
while (l>0) or (a[ l ]>1) do
begin
ans:=ans*tail[ a[ 0 ] ] mod 10;
for i:=l downto 1 do
begin
a[ i-1 ]:=a[ i-1 ]+a[ i ] mod 5*10;
a[ i ]:=a[ i ] div 5;
end;
a[ 0 ]:=a[ 0 ] div 5;
while (a[ l ]=0) and (l>0) do dec(l);
five:=(five+(a[ 0 ]+a[ 1 ]*10)) mod 4;
end;
for i:=1 to five do ans:=ans*8 mod 10;
writeln(ans);
until seekeof;
end.
|