ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1108. Наследство

Please help!!! (almosat correct program inside)
Послано Vlad Ionescu 2 июл 2003 21:24
Can anyone tell me what is wrong with this program? I get WA. I used
bignums, but instead of representing the numbers in base 10, i did it
in base 1000. I checked all my answers with my slow program (which
got TLE) and they seem to be right. Here's the code:


type bignum=array[0..35000] of longint;
var a,b:bignum;
    n,i,j:longint;
procedure subs(var x,y:bignum);
var i:longint;
begin
  for i:=x[0] downto 1 do
      if i<=y[0] then begin
      x[i]:=x[i]-y[i];
      if x[i]<0 then begin
         dec(x[i+1]); x[i]:=x[i]+1000;
         end;
      end;
  while x[x[0]]=0 do dec(x[0]);
end;
procedure square(a:bignum; var b:bignum);
var i,j:longint;
begin
  fillchar(b,sizeof(b),0);
  b[0]:=2*a[0];
  for i:=1 to a[0] do
      for j:=1 to a[0] do
          b[i+j-1]:=b[i+j-1]+a[i]*a[j];
   for i:=1 to b[0]-1 do
       if  b[i]>999 then begin
           b[i+1]:=b[i+1]+b[i] div 1000;
           b[i]:=b[i] mod 1000;
           end;
   if b[b[0]]=0 then dec(b[0]);
end;
begin
  readln(n);
  fillchar(a,sizeof(a),0);
  a[0]:=1; a[1]:=2;
  writeln('2');
  for i:=2 to n do begin
      square(a,b);
      subs(b,a);
      inc(b[1]);
      k:=1;
      while b[k]>999 do begin
            b[k]:=b[k] mod 1000;
            inc(k);
            inc(b[k]);
            end;
      if k>b[0] then inc(b[0]);
      a:=b;
      for j:=a[0] downto 1 do begin
          if (j<>a[0]) and (a[j]<100) then write('0');
          if (j<>a[0]) and (a[j]<10) then write('0');
          write(a[j]);
          end;
      writeln;
      end;
end.
Re: Here is my AC solution,I think it can help you
Послано ACer 4 июл 2003 20:49
const max=30000;
type arr=array[1..max] of longint;
var
   c,a,b:arr;

   i,j,n,k,l,t:longint;

procedure chen;
var i,j,k:longint;
begin
     i:=max;k:=max;
     while a[i]=0 do dec(i);
     while b[k]=0 do dec(k);
     l:=i+k;
     repeat
           j:=0;
           repeat
                 inc(j);
                 c[i+j-1]:=c[i+j-1]+a[i]*b[j];
                 until j>=k;
                 dec(i);
           until i<=0;

end;
begin
     readln(n);a[1]:=2;b[1]:=1;
     writeln(2);
     l:=1;
     for i:=2 to n do begin
         fillchar(c,sizeof(c),0);
         chen;
         a:=c;
         for j:=1 to max do
             if a[j]>=100 then begin
                a[j+1]:=a[j+1]+a[j] div 100;
                a[j]:=a[j] mod 100;
                end;
         b:=a;
         inc(a[1]);j:=1;
         while a[j]>=100 do begin
                a[j+1]:=a[j+1]+a[j] div 100;
                a[j]:=a[j] mod 100;
                end;
         k:=maX;
         while a[k]=0 do dec(k);
         write(a[k]);
         for j:=k-1 downto 1 do
         if a[j]=0 then write('00')
         else
         begin
          t:=10;
          while a[j]<t do
          begin
               write('0');
               t:=t div 10;

               end;
               write(a[j]);
               end;
         writeln;
         end;

end.
Thank you!
Послано Vlad Ionescu 9 июл 2003 07:22
Thank you, I got AC!
Couldn't find the bug in my first program, it gave the same results
as yours up to test 10, after tha they were to big to check, but I
rewrote it from scrap and got AC!