Сообщение Re[3]: Поиск степеней по модулю простого числа от 27.05.2019 16:22
Изменено 27.05.2019 17:59 cures
Re[3]: Поиск степеней по модулю простого числа
Здравствуйте, kfmn, Вы писали:
K>Спасибо за потраченное время, но, увы, этот вариант тоже не устроил систему (вероятно, там более слабое железо
).
Вам же не нужно само значение логарифма, достаточно понять, представляется ли. А представляется число тогда и только тогда, когда логарифм числа (по какому-нибудь образующему) кратен логарифму основания (по модулю (p-1)). Итого, сначала вычисляете наименьшую натуральную степень m, в которую надо возвести основание a чтобы получить 1. Затем для каждого числа x от l до r возводите его (быстрым возведением) в степень m. Если получилась единица — x представимо, иначе нет.
Второй, самый тупой вариант, как раз для первокурсников: неспеша возводите a в натуральные степени (одно умножение), пока не получите снова a. Каждый результат проверяете на попадание в отрезок. Выписываете список попавших. В качестве защиты от злыдней, если a — образующий (проверяется мгновенно), то сразу выписываете весь отрезок.
K>Спасибо за потраченное время, но, увы, этот вариант тоже не устроил систему (вероятно, там более слабое железо
Вам же не нужно само значение логарифма, достаточно понять, представляется ли. А представляется число тогда и только тогда, когда логарифм числа (по какому-нибудь образующему) кратен логарифму основания (по модулю (p-1)). Итого, сначала вычисляете наименьшую натуральную степень m, в которую надо возвести основание a чтобы получить 1. Затем для каждого числа x от l до r возводите его (быстрым возведением) в степень m. Если получилась единица — x представимо, иначе нет.
Второй, самый тупой вариант, как раз для первокурсников: неспеша возводите a в натуральные степени (одно умножение), пока не получите снова a. Каждый результат проверяете на попадание в отрезок. Выписываете список попавших. В качестве защиты от злыдней, если a — образующий (проверяется мгновенно), то сразу выписываете весь отрезок.
Re[3]: Поиск степеней по модулю простого числа
Здравствуйте, kfmn, Вы писали:
K>Спасибо за потраченное время, но, увы, этот вариант тоже не устроил систему (вероятно, там более слабое железо
).
Вам же не нужно само значение логарифма, достаточно понять, представляется ли. А представляется число тогда и только тогда, когда логарифм числа (по какому-нибудь образующему) кратен логарифму основания (по модулю (p-1)). Итого, сначала вычисляете наименьшую натуральную степень m, в которую надо возвести основание a чтобы получить 1. Затем для каждого числа x от l до r возводите его (быстрым возведением) в степень m. Если получилась единица — x представимо, иначе нет.
Второй, самый тупой вариант, как раз для первокурсников: неспеша возводите a в натуральные степени (одно умножение), пока не получите снова a. Каждый результат проверяете на попадание в отрезок. Выписываете список попавших. В качестве защиты от злыдней, если a — образующий (проверяется мгновенно), то сразу выписываете весь отрезок.
Реализовал первый вариант.
Последний тесткейс от Sergei MO выкинул, так как в нём p=13^8, что ни разу не есть простое число.
В каждом тесткейсе нашлось ровно по 100 чисел.
Слегка не укладывается в миллисекунду, попробуйте, если тестовая система ещё доступна.
K>Спасибо за потраченное время, но, увы, этот вариант тоже не устроил систему (вероятно, там более слабое железо
Вам же не нужно само значение логарифма, достаточно понять, представляется ли. А представляется число тогда и только тогда, когда логарифм числа (по какому-нибудь образующему) кратен логарифму основания (по модулю (p-1)). Итого, сначала вычисляете наименьшую натуральную степень m, в которую надо возвести основание a чтобы получить 1. Затем для каждого числа x от l до r возводите его (быстрым возведением) в степень m. Если получилась единица — x представимо, иначе нет.
Второй, самый тупой вариант, как раз для первокурсников: неспеша возводите a в натуральные степени (одно умножение), пока не получите снова a. Каждый результат проверяете на попадание в отрезок. Выписываете список попавших. В качестве защиты от злыдней, если a — образующий (проверяется мгновенно), то сразу выписываете весь отрезок.
Реализовал первый вариант.
Последний тесткейс от Sergei MO выкинул, так как в нём p=13^8, что ни разу не есть простое число.
В каждом тесткейсе нашлось ровно по 100 чисел.
| Для остальных тайминги: | |
| a=29, p=999999937, l=204411352, r=204412600 0.000429843s a=7, p=999999937, l=450141522, r=450142959 0.000491738s a=32, p=999999751, l=239615046, r=239616639 0.000556290s a=41, p=999999937, l=395909863, r=395911989 0.000637724s a=6, p=999999751, l=217939683, r=217942142 0.000783899s a=6, p=999999883, l=724460982, r=724463816 0.000936862s a=35, p=999999937, l=399778083, r=399780936 0.000885491s a=2, p=999999937, l=432617324, r=432621146 0.001143331s | |
Слегка не укладывается в миллисекунду, попробуйте, если тестовая система ещё доступна.
| Код | |
| |