ENG  RUSTimus Online Judge
Online Judge
Problems
Authors
Online contests
About Online Judge
Frequently asked questions
Site news
Webboard
Links
Problem set
Submit solution
Judge status
Guide
Register
Update your info
Authors ranklist
Current contest
Scheduled contests
Past contests
Rules
back to board

Discussion of Problem 1165. Subnumber

Tell me why??????????? WA!!!!!!!
Posted by Levin 24 Jun 2002 22:36
type tnode=array[1..500] of integer;
var a,b,c,r:tnode;
    i,j,k,v,n,tb,tc,tr:integer;
    ss:string;

procedure sub;
var i:integer;
begin
  dec(c[1]);
  i:=1;
  while c[i]=-1 do
  begin
    dec(c[i+1]);
    c[i]:=9;
    inc(i);
  end;
  if (tc>1)and(c[tc]=0) then dec(tc);
end;

procedure add;
var i:integer;
begin
  inc(c[1]);
  i:=1;
  while c[i]=10 do
  begin
    inc(c[i+1]);
    c[i]:=0;
    inc(i);
  end;
  if c[tc+1]>0 then inc(tc);
end;

function equal(x,y,k:integer):boolean;
var i:Integer;
begin
  equal:=false;
  for i:=0 to k-1 do
  if c[i+x]<>a[y+i] then exit;
  equal:=true;
end;

function check:boolean;
begin
  check:=false;
  c:=b;tc:=tb;
  k:=j+1;
  while k<=n do
  begin
    sub;
    if (tc=1)and(c[1]=0) then exit;
    if k+tc-1<=n then
    begin
      if equal(1,k,tc) then else exit;
      inc(k,tc);
    end else
    begin
      if equal(1,k,n-k+1) then else exit;
      k:=n+1;
    end;
  end;

  c:=b;tc:=tb;
  k:=j-i;
  while k>0 do
  begin
    add;
    if k-tc+1>0 then
    begin
      if equal(1,k-tc+1,tc) then else exit;
      dec(k,tc);
    end else
    begin
      if equal(tc-k+1,1,k) then else exit;
      k:=0;
    end;
  end;
  check:=true;
end;

procedure wish(k:integer);
var i:integer;
begin
  if tb>tr then exit;
  if tb<tr then
  begin
    r:=b;tr:=tb;v:=k;
    exit;
  end;
  for i:=tb downto 1 do
  begin
    if b[i]>r[i] then exit;
    if b[i]<r[i] then
    begin
      r:=b;tr:=tb;v:=k;
      exit;
    end;
  end;
  if k<v then v:=k;
end;

procedure compute;
begin
  if tr=1 then
  begin
    tc:=1;c[1]:=r[1]+v;
    exit;
  end;

  fillchar(c,sizeof(c),0);
  for i:=1 to tr-1 do
  begin
    j:=i;k:=i;
    while j>0 do
    begin
      inc(c[k],j mod 10);
      if c[k]>9 then begin inc(c[k+1]);dec(c[k],10);end;
      j:=j div 10;
      inc(k);
    end;
  end;
  if c[k]>0 then tc:=k else tc:=k-1;

  k:=0;
  for i:=1 to tc do
  begin
    c[i]:=c[i]*9+k;
    k:=0;
    while c[i]>9 do
    begin
      inc(k);
      dec(c[i],10);
    end;
  end;
  if k>0 then begin inc(tc);c[tc]:=k;end;

  j:=tr;
  dec(r[tr]);
  while (tr>0)and(r[tr]=0) do dec(tr);
  for i:=1 to tr do
  begin
    inc(c[i],r[i]*j);
    while c[i]>9 do
    begin
      inc(c[i+1]);
      dec(c[i],10);
    end;
  end;
  i:=tr+1;
  while c[i]>9 do
  begin
    while c[i]>9 do
    begin
      inc(c[i+1]);
      dec(c[i],10);
    end;
    inc(i);
  end;
  if i>tc then tc:=i;
  if c[tc]=0 then dec(tc);

  inc(c[1],v+1);
  i:=1;
  while (c[i]>9)or(c[i]<0) do
  begin
    while c[i]>9 do
    begin
      inc(c[i+1]);
      dec(c[i],10);
    end;
    while c[i]<0 do
    begin
      dec(c[i+1]);
      inc(c[i],10);
    end;
    inc(i);
  end;
  if i>tc then tc:=i;
  if c[tc]=0 then dec(tc);
end;

begin
  assign(input,'');
  reset(input);
  readln(ss);
  while ss[1]=' ' do delete(ss,1,1);
  while ss[length(ss)]=' ' do  delete(ss,length(ss),1);
  n:=length(ss);
  fillchar(a,sizeof(a),0);
  for i:=1 to n do a[i]:=ord(ss[n+1-i])-48;

  tr:=500;
  fillchar(b,sizeof(b),0);
  for i:=1 to n-1 do
  begin
    tb:=i;
    for j:=n downto n-i+1 do
    if j<i then break else
    if a[j]>0 then
    begin
      move(a[j-i+1],b[1],i*2);
      if check then wish(j-n);
    end;
    if tr<500 then break;
  end;

  if tr=500 then
  if a[n]=0 then
  begin
    tr:=n+1;
    move(a[1],r[1],n*2);
    r[tr]:=1;
    v:=1;
  end else
  begin
    tr:=n;
    move(a[1],r[1],n*2);
    v:=0;
  end;

  fillchar(c,sizeof(c),0);
  for i:=n-1 downto 1 do
  if a[i]>0 then
  begin
    tc:=n-i;
    move(a[i+1],c[1],tc*2);
    add;
    if tc>n-i then
Re: Tell me why??????????? WA!!!!!!!
Posted by Yang Yi 15 Oct 2002 15:32
> type tnode=array[1..500] of integer;
> var a,b,c,r:tnode;
>     i,j,k,v,n,tb,tc,tr:integer;
>     ss:string;
>
> procedure sub;
> var i:integer;
> begin
>   dec(c[1]);
>   i:=1;
>   while c[i]=-1 do
>   begin
>     dec(c[i+1]);
>     c[i]:=9;
>     inc(i);
>   end;
>   if (tc>1)and(c[tc]=0) then dec(tc);
> end;
>
> procedure add;
> var i:integer;
> begin
>   inc(c[1]);
>   i:=1;
>   while c[i]=10 do
>   begin
>     inc(c[i+1]);
>     c[i]:=0;
>     inc(i);
>   end;
>   if c[tc+1]>0 then inc(tc);
> end;
>
> function equal(x,y,k:integer):boolean;
> var i:Integer;
> begin
>   equal:=false;
>   for i:=0 to k-1 do
>   if c[i+x]<>a[y+i] then exit;
>   equal:=true;
> end;
>
> function check:boolean;
> begin
>   check:=false;
>   c:=b;tc:=tb;
>   k:=j+1;
>   while k<=n do
>   begin
>     sub;
>     if (tc=1)and(c[1]=0) then exit;
>     if k+tc-1<=n then
>     begin
>       if equal(1,k,tc) then else exit;
>       inc(k,tc);
>     end else
>     begin
>       if equal(1,k,n-k+1) then else exit;
>       k:=n+1;
>     end;
>   end;
>
>   c:=b;tc:=tb;
>   k:=j-i;
>   while k>0 do
>   begin
>     add;
>     if k-tc+1>0 then
>     begin
>       if equal(1,k-tc+1,tc) then else exit;
>       dec(k,tc);
>     end else
>     begin
>       if equal(tc-k+1,1,k) then else exit;
>       k:=0;
>     end;
>   end;
>   check:=true;
> end;
>
> procedure wish(k:integer);
> var i:integer;
> begin
>   if tb>tr then exit;
>   if tb<tr then
>   begin
>     r:=b;tr:=tb;v:=k;
>     exit;
>   end;
>   for i:=tb downto 1 do
>   begin
>     if b[i]>r[i] then exit;
>     if b[i]<r[i] then
>     begin
>       r:=b;tr:=tb;v:=k;
>       exit;
>     end;
>   end;
>   if k<v then v:=k;
> end;
>
> procedure compute;
> begin
>   if tr=1 then
>   begin
>     tc:=1;c[1]:=r[1]+v;
>     exit;
>   end;
>
>   fillchar(c,sizeof(c),0);
>   for i:=1 to tr-1 do
>   begin
>     j:=i;k:=i;
>     while j>0 do
>     begin
>       inc(c[k],j mod 10);
>       if c[k]>9 then begin inc(c[k+1]);dec(c[k],10);end;
>       j:=j div 10;
>       inc(k);
>     end;
>   end;
>   if c[k]>0 then tc:=k else tc:=k-1;
>
>   k:=0;
>   for i:=1 to tc do
>   begin
>     c[i]:=c[i]*9+k;
>     k:=0;
>     while c[i]>9 do
>     begin
>       inc(k);
>       dec(c[i],10);
>     end;
>   end;
>   if k>0 then begin inc(tc);c[tc]:=k;end;
>
>   j:=tr;
>   dec(r[tr]);
>   while (tr>0)and(r[tr]=0) do dec(tr);
>   for i:=1 to tr do
>   begin
>     inc(c[i],r[i]*j);
>     while c[i]>9 do
>     begin
>       inc(c[i+1]);
>       dec(c[i],10);
>     end;
>   end;
>   i:=tr+1;
>   while c[i]>9 do
>   begin
>     while c[i]>9 do
>     begin
>
Re: Tell me why??????????? WA!!!!!!!
Posted by Yang Yi 15 Oct 2002 15:34
Try this text:
99
I think the answer is 169.
86  87  88  8(9  9)0
Your output is 188.