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

Общий форум

Help! Why does my program get CE? (Problem 1118)
Послано LJSC 19 окт 2002 17:42
var
  pr: array[1..400]of integer;
  prcnt: integer;

function ispr(a: longint): boolean;
var i: integer;
begin
  ispr := false;
  for i := 1 to prcnt do
    if a div pr[i] < pr[i] then
      break
    else if a mod pr[i] = 0 then
      exit;
  ispr := true;
end;

function trivial(v0: longint): extended;
var
  i, l: longint;
  k, kk: comp;
begin
  l := v0;
  k := 1;
  for i := 1 to prcnt do
    if v0 div pr[i] < pr[i] then
      break
    else if v0 mod pr[i] = 0 then
    begin
      kk := pr[i];
      while v0 mod pr[i] = 0 do
      begin
        kk := kk * pr[i];
        v0 := v0 div pr[i];
      end;
      kk := (kk - 1) / (pr[i] - 1);
      k := k * kk;
    end;
  if v0 > 1 then k := k * (comp(v0) * v0 - 1) / (v0 - 1);
  trivial := k / l;
end;

var
  i, j, res, res2, bak: longint;
  ee, ss: extended;
begin
  pr[1] := 2; prcnt := 1;
  i := 3;
  while i < 1010 do
  begin
    if ispr(i) then
    begin
      inc(prcnt);
      pr[prcnt] := i;
    end;
    inc(i);
  end;
  readln(i, bak); j := bak;
  if i < 2 then
  begin
    writeln('1');
    exit;
  end;
  res2 := 0;
  while j >= i do
  begin
    if ispr(j) then
    begin
      res2 := j;
      break;
    end;
    dec(j);
  end;
  j := bak;
  ss := 1e200;
  while(j >= i)and(j > res2)do
  begin
    ee := trivial(j);
    if ee < ss then
    begin
      ss := ee;
      res := j;
    end;
    dec(j);
  end;

  writeln(res);
end.