Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Курсы ККДП
Дистрибутивы
Статьи
Ссылки


 

Алгоритм Евклида

(Время: 1 сек. Память: 16 Мб Сложность: 40%)

При решении данной задачи следует учитывать следующее. Поскольку ограничения на числа a, b, c, d в этой задаче достаточно большие, простая симуляция описанного в условии алгоритма не будет укладываться в ограничения по времени.

Опишем более быстрый алгоритм решения данной задачи. Разобьем процесс применения алгоритма Евклида к паре чисел (a, b) на фазы. Началом фазы будем считать обмен на шаге 3, а окончанием – момент перед следующим таким обменом (или окончание работы алгоритма – для последней фазы). Нетрудно видеть, что, если в начале фазы a=a0, b=b0, то в ее конце a=a0 mod b0, b=b0. В то же время на каждом шаге внутри фазы из a вычиталось b0, т.е. a последовательно было равно a0, a0-b0, a0-2b0, …, a0 mod b0.

Для того чтобы проверить, встречалась ли пара (c, d) во время фазы, надо проверить следующие условия:

  1. d=b0
  2. c – (a0 mod b0) делится на b0
  3. с ≤ a0

В задаче необходимо проверить несколько наборов чисел a, b, c и d. Но здесь мы рассмотрим алгоритмическую реализацию лишь для одной такой четверки, т.к. обработка целого набора таких данных не представляет никакой сложности в реализации.

    int a,b,c,d;

    read(a,b,c,d);

    while(b > 0){
      if(a=c and b=d) break;
      if(b > a) a<-->b ;
      if(b > 0){
        if(b=d and a>=c and c>=a mod b and (c - a mod b) mod b=0) break;
        a:= a mod b;
      end;
    }
    
    if(b>0) write('YES') else write('NO');

[Обсуждение] [Все попытки] [Задача]


Красноярский краевой Дворец пионеров, (c)2006 - 2026, ИНН 246305493507, E-mail: admin@acmp.ru