Блог пользователя serega.belarus

Автор serega.belarus, 12 лет назад, По-русски

Доброго времени суток, Пытаюсь решить задачу 1673 с acm.timus.ru(click) Пытался решить путем предпросчета функции эйлера для чисел от 1 до 2*10^5, и после проходом по порядку ищу первое число, которое дает K. Но это решение проходит только 6 тестов (в моей реализации). На 7-ом тесте дают число большое 2*10^5. Меня интересует, как можно быстро найти аргумент функции эйлера, зная её значение ? Мой код(click)

  • Проголосовать: нравится
  • +6
  • Проголосовать: не нравится

»
12 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

Быстро — никак. Нужно использовать перебор с отсечением. Подсказка: какие делители φ(n) могут указывать на факторизацию n?

P.S. Мог бы скинуть исходник, но у меня настолько жуткий говнокод, что Вам лучше его не видеть.

»
12 лет назад, # |
Rev. 4   Проголосовать: нравится 0 Проголосовать: не нравится

Вот буквально неделю назад решал эту задачу.

Сначала факторизировал число K. Потом, перебрав все его делители, нашёл все такие простые P, что P-1 делит K.

Таким образом получил все простые числа, на которые может делиться N, а так же соответствующие им обязательные степени для нашего K (то-есть факторизация К). Отсортировал эти простые по убыванию и запустил перебор.

На каждом шаге для текущего простого было два варианта:

1)Если текущая степень этого простого для нашего текущего N меньше чем должна быть, то домножить до необходимой степени, и пустить перебор дальше.

2)Если текущая степень равна обязательной, то разветвляем наш перебор: не домножая на это простое P, и домножив на P ( соответственно текущее K домножится на P-1).

Если доходим до конца и текущее К становится равным искомому, то мы получили то, что искали.

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

Решение прошло, но за 1.1 сек. То-есть очень медленно, по сравнению с лучшими решениями, поэтому мне тоже хотелось бы услышать другие идеи решения этой задачи=)

Объяснять я конечно не мастер, да и решение объёмное, но вот так в общем...)

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

It is the same problem I have.

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

It is the same problem I have.

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    There is one DP method. Let DN — number of divisors of X. Let PN Number of primes p such that p — 1 is divisor of X. Note PN <= DN < 2000. int DP(int id_of_divisor, int primeNumberId). There is no more than PN * DN states and at each state you can use current prime number 0..log(X) times.

»
5 лет назад, # |
  Проголосовать: нравится -8 Проголосовать: не нравится

попробуй бинпоиском искать среди отсортированных (по парам в векторе пар, дабы фиксировался номер функции) значений функции эйлера и так искать