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

Обсуждение задачи 1086. Криптография

Ох уж этот time limit...
Послано Alexandr 4 фев 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...
Послано ToadMonster 4 фев 2016 21:21
You should optimize "цикл поиска простого число".
For example, if c*c > d then d is definitely prime.
Re: Ох уж этот time limit...
Послано Alexandr 5 фев 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.