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 1086. Cryptography

Ох уж этот time limit...
Posted by Alexandr 4 Feb 2016 15:50
Неужели есть какая-то формула по нахождению н-ного элемента без 3-ех вложенных циклов?
var
a,r: array[1..15001] of integer;
b,c,d,i,y:integer;
j :boolean;
begin
d:=2;

readln(b);
 for i:=1 to b do    //цикл ввода
   readln(a[i]);    //номера простых чисел
   y:=0;
   if y<a[i] then begin
   for i:=1 to b do      //цикл номеров элемента
      begin
      while y<=a[i] do   //пока количество известных элементов меньше нужного, делать
        begin
        c:=2;      //минимальный делитель
        j:=true;
        while (j<>false) and (c<>d) do  //цикл поиска простого число
        if ((d mod c)=0) then j:=false else inc(c);
        if j=true then begin r[y+1]:=d; inc(y) end; inc(d);
        end;
        end;       end;
  for i:=1 to b do
    writeln(r[a[i]]);
    end.


Edited by author 04.02.2016 15:55
Re: Ох уж этот time limit...
Posted by ToadMonster 4 Feb 2016 21:21
You should optimize "цикл поиска простого число".
For example, if c*c > d then d is definitely prime.
Re: Ох уж этот time limit...
Posted by Alexandr 5 Feb 2016 08:02
Spasibo,ya yje vse reshil.
var
  a, r: array[1..15001] of integer;
  b, c, d, i, y: integer;
  j: boolean;

begin
  d := 2;
  r[1]:=2;
  readln(b);
  for i := 1 to b do //цикл ввода
    readln(a[i]); //номера простых чисел
  y := 0;
  if y < a[i] then begin
    for i := 1 to b do //цикл номеров элемента
    begin
      while y < a[i] do //пока количество известных элементов меньше нужного, делать
      begin
        c := 1; //минимальный делитель
        j := true;
        while (j <> false) and (r[c]<>0) and ((d div 2)>=r[c]) do //цикл поиска простого число
          if ((d mod r[c]) = 0) then j := false else inc(c);
        if j = true then begin r[y + 1] := d;inc(y) end;inc(d);
      end;
    end; end;
  for i := 1 to b do
    writeln(r[a[i]]);
end.