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

Common Board

Help! Why does my program get CE? (Problem 1118)
Posted by LJSC 19 Oct 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.