Задача

Сколько оснований лгут

простые числа теория чисел подсчёт вариантов

Тест Миллера — Рабина ошибается на составном n, только если выбранное основание — сильный лжец. Запишем n − 1 = 2s·d с нечётным d. Основание a (1 ≤ a ≤ n − 1) — сильный лжец, если ad ≡ 1 (mod n) или a2id ≡ −1 (mod n) для какого-нибудь i от 0 до s − 1. Основание — лжец Ферма, если an−1 ≡ 1 (mod n).

Чтобы понять, насколько опасно число для теста, хочется знать, сколько у него лжецов того и другого сорта. Перебрать все основания нельзя: числа доходят до 4·10¹⁸. Зато для каждого числа известно его разложение на простые множители.

Например, у 2047 = 23 · 89 сильных лжецов 242 (среди них 1, 2 и 2046), а лжецов Ферма — 484.

Вход

В первой строке число t (1 ≤ t ≤ 10 000). В каждой из следующих t строк описано одно число: сначала количество различных простых делителей k (1 ≤ k ≤ 15), затем k пар «простое p, показатель e» в порядке возрастания p. Число n = ∏ pe нечётное, составное и меньше 2⁶².

Выход

Для каждого числа — строку из двух чисел: сколько сильных лжецов и сколько лжецов Ферма среди оснований от 1 до n − 1.

Примеры

Пример 1

Вход
5
1 3 2
2 3 1 5 1
3 3 1 11 1 17 1
2 23 1 89 1
3 7 1 19 1 67 1
Выход
2 2
2 4
10 320
242 484
1782 7128

Ограничения

Время · Python
4000 мс
Время · Go
1000 мс
Память
256 МБ
Проверка
6 тестов

Разбор

Открывайте по ступеням: каждая следующая подсказывает больше. Можно сразу к решению — но задача, решённая с одной подсказкой, запоминается лучше.

1Подсказка 1

Лжец обязательно взаимно прост с n. По китайской теореме об остатках выбрать основание по модулю n — то же, что выбрать его остаток по модулю каждого pe независимо. А сравнение по модулю n выполнено, когда оно выполнено по модулю каждого pe. Сколько решений у ad ≡ 1 по модулю одного pe?

2Подсказка 2

Обратимые остатки по модулю pe (для нечётного простого p) образуют цикл: все они — степени одного остатка g, первообразного корня. Их φ(pe) = pe−1(p − 1). В цикле длины m уравнение xt = 1 имеет ровно gcd(t, m) решений. А xt = −1?

3Подсказка 3

Случаи «ad ≡ 1» и «a2id ≡ −1» при разных i не пересекаются: после −1 в цепочке идут только единицы. Значит, лжецов можно считать по случаям и складывать.

4Идея

Считаем решения по модулю каждого pe и перемножаем — это китайская теорема. Пусть p − 1 = 2sp·dp с нечётным dp. По модулю pe: у ad ≡ 1 ровно gcd(d, dp) решений, у a2id ≡ −1 — ровно 2i·gcd(d, dp), если i < sp, и ни одного иначе. Перемножив по всем k простым и сложив случаи, получаем формулу Монье:

$$S(n) = \prod_p \gcd(d, d_p) \cdot \Bigl(1 + \sum_{i=0}^{\nu - 1} 2^{ik}\Bigr), \qquad F(n) = \prod_p \gcd(n - 1, p - 1),$$

где ν — наименьшее из sp.

5Разбор

Почему решений столько. Пусть g — первообразный корень по модулю pe, m = φ(pe), и x = gy. Тогда xt = 1 означает m | ty, и подходящих y от 0 до m − 1 ровно gcd(t, m). Остаток −1 — это gm/2 (единственный остаток порядка 2), и xt = −1 означает ty ≡ m/2 (mod m). Такое сравнение разрешимо, когда gcd(t, m) делит m/2, и тогда у него тоже gcd(t, m) решений.

Теперь подставим. Число p делит n, значит, не делит n − 1 и d, поэтому gcd(d, m) = gcd(d, dp) — от множителя pe−1 и от двоек в m нечётное d ничего не берёт. Для t = 2id получаем gcd(t, m) = 2min(i, sp)·gcd(d, dp), а m/2 содержит двойку в степени sp − 1. Делимость выполнена ровно при i < sp. Так же для лжецов Ферма: gcd(n − 1, m) = gcd(n − 1, p − 1).

По китайской теореме основание — лжец, когда нужное сравнение выполнено по модулю каждого pe, а остатки по разным модулям выбираются независимо. Случай ad ≡ 1 даёт ∏ gcd(d, dp) оснований, случай a2id ≡ −1 — произведение 2i·gcd(d, dp) по всем k простым, то есть 2ik·∏ gcd(d, dp), если i меньше всех sp, и ноль иначе. Складываем случаи i = 0, …, ν − 1.

Проверка на 2047 = 23 · 89: d = 1023, 22 = 2 · 11, 88 = 8 · 11, ν = 1, k = 2. S = 11 · 11 · (1 + 1) = 242, F = gcd(2046, 22) · gcd(2046, 88) = 22 · 22 = 484.

В Go всё помещается в uint64: S и F не больше n, а слагаемые суммы — степени двойки не больше 2νk ≤ ∏ p ≤ n, потому что каждое p ≥ 2ν + 1.

5+Решение
6Сложность

На число — k алгоритмов Евклида и вычисление n из разложения: O(k log n). Перебор оснований стоил бы O(n log n) — для n около 10¹⁸ это миллиарды лет.

7Типичные ошибки
  • Перебор оснований. Верен и годится для проверки на числах до нескольких тысяч, но на больших тестах безнадёжен.
  • Забытая единица в скобке. Слагаемое 1 — это основания с ad ≡ 1, например само a = 1. Без него у 15 вышел бы один лжец, а их два: 1 и 14.
  • Степени простых. Для pe хочется взять gcd(d, φ(pe)) — и это правильно, просто множитель pe−1 с d общих делителей не имеет. А вот gcd(n − 1, pe − 1) вместо gcd(n − 1, p − 1) уже ошибка.
  • ν по показателю n − 1. Сумма идёт до наименьшего sp, а не до s: при i ≥ sp по модулю этого pe решений нет.

Алгоритмы задачи