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

Обсуждение задачи 1153. Суперкомпьютер

I got Compilation Error! Help me!!!!!!!!!!!
Послано Algorithmus_UA(algorithmus@univ.kiev.ua) 14 окт 2002 22:41
type
 long = record
              a:array[1..1300]of byte;
              l:integer;
        end;
var h,i,c:integer;
    ch:Char;
    a,tmp:long;
procedure add2(var a:long;b:longint);
var l,c,k,i:longint;
begin
  k:=b;
{  if a.l>b.l then l:=a.l else l:=b.l;}l:=a.l;
  for i:=1 to l do
  begin
    c:=a.a[i];
    a.a[i]:=(c+k)mod 10;
    k:=(c+k)div 10;
  end;
{  a.l:=i;}
  while k<>0 do
  begin
    inc(a.l);
    a.a[a.l]:=K mod 10;
    K:=K div 10;
  end;
end;

procedure add(var a,b:long);

var l,c,k,i:integer;
begin
  k:=0;
  if a.l>b.l then l:=a.l else l:=b.l;
  for i:=1 to l do
  begin
    c:=a.a[i];
    a.a[i]:=(c+b.a[i]+k)mod 10;
    k:=(c+b.a[i]+k)div 10;
  end;
  a.l:=l;
  if k<>0 then
  begin
    inc(a.l);
    a.a[a.l]:=K;
  end;
end;

procedure sub(var a,b:long);
var l,c,k,i:integer;
begin
  k:=0;
  if a.l>b.l then l:=a.l else l:=b.l;
  for i:=1 to l do
  begin
    c:=a.a[i];
    a.a[i]:=(c-b.a[i]+k+10)mod 10;
{    k:=(c-b.a[i]+k)div 10;}
    if (c-b.a[i]+k)<0 then k:=-1 else k:=0;
  end;
  a.l:=l;
{  if k<>0 then
  begin
    inc(a.l);
    a.a[a.l]:=K;
  end;}
  i:=a.l;
  for i:=a.l downto 1 do if a.a[i]<>0 then break;
  a.l:=i;
end;

procedure mul_i(var a:long;b:longint);
var k:longint;c,i:integer;
begin
  k:=0;
  for i:=1 to a.l do
  begin
    c:=a.a[i];
    a.a[i]:=(c*b+k)mod 10;
    k:=(c*b+k)div 10;
  end;
{  a.l:=i;}
  while k<>0 do
  begin
    inc(a.l);
    a.a[a.l]:=K mod 10;
    k:=k div 10;
  end;
  i:=a.l;
  for i:=a.l downto 1 do if a.a[i]<>0 then break;
  a.l:=i;
end;

procedure mul(var a,b:long);
var tmp,_a:long;
    i,j:integer;
begin
  fillchar(tmp,sizeof(tmp),0);
  for i:=1 to b.l do
  begin
    _a:=a;
    mul_i(_a,b.a[i]);
    for j:=_a.l downto 1 do _a.a[j+i-1]:=_a.a[j];
    for j:=1 to i-1 do _a.a[j]:=0;
    _a.l:=_a.l+i-1;
    add(tmp,_a);
  end;
  a:=tmp;
end;

function cmp(var a,b:long):integer;
var i:integer;
begin
 if a.l>b.l then cmp:=+1 else if a.l<b.l then cmp:=-1
 else
 begin
   for i:=a.l downto 1 do if a.a[i]>b.a[i] then
   begin
     cmp:=+1;exit;
   end
   else if a.a[i]<b.a[i] then
   begin
     cmp:=-1;exit;
   end;
   cmp:=0;
 end;
end;

procedure _sqrt(var a:long);
var tmp,ost,tmp2:long;
    r:long;
    tek,i,h:integer;
    c:byte;
begin
  h:=0;
  fillchar(tmp,sizeof(tmp),0);
  fillchar(ost,sizeof(tmp),0);
  if a.l mod 2 = 0 then tek:=a.l-1 else tek:=a.l;
  while true do
  begin
    for i:=tmp.l downto 1 do tmp.a[i+1]:=tmp.a[i];
    inc(tmp.l);
    mul_i(ost,100);
    add2(ost,a.a[tek+1]*10+a.a[tek]);
    for i:=0 to 9 do
    begin
      tmp.a[1]:=i;tmp2:=tmp;
      mul_i(tmp2,i);
      if cmp(ost,tmp2) = -1 then
      begin
        dec(i);
        break;
      end;
    end;
    inc(h);r.a[h]:=i;
    tmp.a[1]:=i;tmp2:=tmp;
    mul_i(tmp2,i);
    sub(ost,tmp2);
    add2(tmp,i);
    tek:=tek-2;
    if tek<0 then break;
  end;
  r.l:=h;
  for i:=1 to h div 2 do
  begin
    c:=r.a[i];r.a[i]:=r.a[h-i+1];r.a[h-i+1]:=c;
  end;
  a:=r;
end;

procedure _div(var a:long);
var k,i:longint;
begin
  K:=0;
  for i:=a.l downto 1 do
  begin
    K:=K*10+a.a[i];
    if not((K div 2=0)and(i = a.l)) then write(K div 2);
    K:=K mod 2;
  end;
  writeln;
{  if K = 0 then}
end;
begin
{  assign(input,'1153.dat');reset(input);}
  while not seekeof do
  begin
    inc(H);
    read(ch);
    a.a[h]:=ord(ch)-ord('0');
  end;
  for i:=1 to h div 2 do
  begin
    c:=a.a[i];a.a[i]:=a.a[h-i+1];a.a[h-i+1]:=c;
  end;
  a.l:=h;
  mul_i(a,8);
  tmp.a[1]:=1;tmp.l:=1;
  add(a,tmp);
  _sqrt(a);
  sub(a,tmp);
  _div(a);
end.