恶心恶心太恶心了
做不下去了
晕
将近300行,回头理理再来调,现在睡觉去,2:40am
type hi=array[0..1000] of integer;
var ori:string;
long:integer;
a,b,ans,best:hi;
procedure init;
begin
best[0]:=maxint;
readln(ori);
long:=length(ori);
end;
procedure incc(var a:string);
var i:integer;
begin
a[length(a)]:=chr(ord(a[length(a)])+1);
for i:=length(a) downto 1 do
if a[i]<=’9′ then exit
else
begin
a[i]:=’0′;
if i=1 then
begin
insert(‘1’,a,1);
exit;
end
else a[i-1]:=chr(ord(a[i-1])+1);
end;
end;
procedure decc(var a:string);
var i:integer;
begin
a[length(a)]:=chr(ord(a[length(a)])-1);
for i:=length(a) downto 1 do
if a[i]>=’0′ then break
else
begin
a[i]:=’9′;
a[i-1]:=chr(ord(a[i-1])-1);
end;
while (a[1]=’0′) and (length(a)>1) do delete(a,1,1);
end;
function com(pos:integer; now:string):boolean;
var i,temp:integer;
num:string;
begin
num:=now;
temp:=pos-length(now);
decc(num);
for i:=1 to temp-1 do
if length(num)-i+1<=0 then break
else
if num[length(num)-i+1]<>ori[temp-i] then exit(false);
while pos<=long do
begin
incc(now);
for i:=1 to length(now) do
if pos+i-1>long then exit(true)
else
if now[i]<>ori[pos+i-1] then exit(false);
pos:=pos+length(now);
end;
exit(true);
end;
function special(len:integer; a,b:string; var return:string):boolean;
var i:integer;
begin
return:=b;
for i:=1 to length(a) do
if len-(length(a)-i)>length(return) then return:=return+a[i]
else
if return[len-(length(a)-i)]<>a[i] then exit(false);
end;
function jian(a,b:hi):hi;
var l,i:integer;
begin
fillchar(jian,sizeof(jian),0);
if a[0]<b[0] then l:=b[0] else l:=a[0];
for i:=1 to l do
begin
jian[i]:=a[i]-b[i]+jian[i];
if jian[i]<0 then
begin
jian[i]:=10+jian[i];
dec(jian[i+1]);
end;
end;
while (jian[l]=0) and (l>1) do dec(l);
jian[0]:=l;
end;
function jia(a,b:hi):hi;
var l,i:integer;
begin
fillchar(jia,sizeof(jia),0);
if a[0]>b[0] then l:=a[0] else l:=b[0];
for i:=1 to l do
begin
jia[i]:=jia[i]+a[i]+b[i];
jia[i+1]:=jia[i] div 10;
jia[i]:=jia[i] mod 10;
end;
if jia[l+1]<>0 then inc(l);
jia[0]:=l;
end;
function cheng(a:hi; b:integer):hi;
var l,i:integer;
begin
fillchar(cheng,sizeof(cheng),0);
for i:=1 to a[0] do
begin
cheng[i]:=cheng[i]+a[i]*b;
cheng[i+1]:=cheng[i] div 10;
cheng[i]:=cheng[i] mod 10;
end;
l:=a[0];
while cheng[l+1]<>0 do
begin
inc(l);
cheng[l+1]:=cheng[l] div 10;
cheng[l]:=cheng[l] mod 10;
end;
cheng[0]:=l;
end;
function bigger(a,b:hi):boolean;
var i:integer;
begin
if a[0]>b[0] then exit(true);
if a[0]<b[0] then exit(false);
for i:=a[0] downto 1 do
begin
if a[i]>b[i] then exit(true);
if a[i]<b[i] then exit(false);
end;
exit(false);
end;
procedure print1(k:integer; num:string);
var len,i:integer;
begin
len:=length(num);
fillchar(a,sizeof(a),0);
for i:=1 to len do
a[i]:=ord(num[len-i+1])-48;
a[0]:=len;
fillchar(b,sizeof(b),0);
b[len]:=1;
b[0]:=len;
ans:=cheng(jian(a,b),len);
b[len]:=0;
for i:=len-1 downto 1 do
begin
b[i]:=9;
b[0]:=i;
b:=cheng(b,i);
ans:=jia(ans,b);
b[i]:=0;
end;
b[0]:=0;
str(k-1,num);
for i:=1 to length(num) do
b[i]:=ord(num[length(num)-i+1])-48;
b[0]:=length(num);
fillchar(a,sizeof(a),0);
a[0]:=1;
a[1]:=1;
ans:=jia(jian(ans,b),a);
if bigger(best,ans) then best:=ans;
end;
procedure print2(k:integer; num:string);
var len,i:integer;
begin
len:=length(num);
fillchar(a,sizeof(a),0);
for i:=1 to len do
a[i]:=ord(num[len-i+1])-48;
a[0]:=len;
fillchar(b,sizeof(b),0);
b[len]:=1;
b[0]:=len;
ans:=cheng(jian(a,b),len);
b[len]:=0;
for i:=len-1 downto 1 do
begin
b[i]:=9;
b[0]:=i;
b:=cheng(b,i);
ans:=jia(ans,b);
b[i]:=0;
end;
b[0]:=0;
str(k,num);
for i:=1 to length(num) do
b[i]:=ord(num[length(num)-i+1])-48;
b[0]:=length(num);
fillchar(a,sizeof(a),0);
a[0]:=1;
a[1]:=1;
ans:=jian(ans,b);
ans:=jia(ans,a);
if bigger(best,ans) then best:=ans;
end;
function judge(len:integer):boolean;
var i:integer;
return:string;
begin
judge:=false;
for i:=1 to len do
if ori[i]<>’0′ then
if i+len-1<=long then
begin
if com(i+len,copy(ori,i,len)) then
begin
print1(i,copy(ori,i,len));
judge:=true;
end;
end
else
if special(len,copy(ori,1,i-1),copy(ori,i,255),return) then
begin
incc(return);
print2(i-1,return);
judge:=true;
end;
end;
procedure doit;
var len:integer;
begin
len:=0;
repeat
inc(len);
until judge(len);
end;
procedure outit;
var i:integer;
begin
for i:=best[0] downto 1 do write(best[i]);
writeln;
end;
begin
assign(output,’out.txt’);
rewrite(output);
init;
doit;
outit;
close(output);
end.