bardakov_a_a's blog

By bardakov_a_a, 12 years ago, In Russian

Дамы и Господа! Нужна Ваша помощь. Решил заняться олимпиадным программированием и вот пока встречаю камни предкновения. Решал задачу с Timus 1110 Степень http://acm.timus.ru/problem.aspx?space=1&num=1110 1110. Степень Ограничение времени: 0.5 секунды Ограничение памяти: 16 МБ Даны целые числа N, M и Y. Напишите программу, которая найдёт все целые числа X в диапазоне [0, M – 1], такие что XN mod M = Y. Исходные данные Ввод содержит единственную строку с числами N, M и Y (0 < N < 999, 1 < M < 999, 0 < Y < 999), записанными через пробел. Результат Выведите все числа X через пробел в одной строке. Числа должны идти в порядке возрастания. Если искомых чисел нет, выведите −1.

Вот собственно код

program Project2;

{$APPTYPE CONSOLE}

var
  N,M,Y: Word;
  i: Word;
  found: Boolean;

function Power(i: Word; N: Word): Integer;
var res: Integer;
begin
  if odd(N) then  res:=i
  else res := 1;
  while N>1 do
  begin
    N:=N div 2;
    i:=i*i;
    if odd(N) then
      res:=res*i;
  end;
  Power:=res;
end;

function Left(x: Integer; y, n: Integer): Integer;
begin
  Left:=Power(x mod n, y) mod n;
end;

begin
  ReadLn(N, M, Y);
  found:=true;
  for i := 0 to M --- 1 do
    if Left(i, N, M) = Y then
    begin
      Write(i, ' ');
      found:=false;
    end;
  if found then Write(-1);
end.


Валиться на 6 тесте. Предполагаю не укладывается по времени, но я уже не знаю как ее еще улучшить. Помогите кто чем сможет

  • Vote: I like it
  • -3
  • Vote: I do not like it