Есть задача в которой нужно посчитать некоторое значение выражения: ((kn + k^(n/2+n%2))/2)%109. Как это посчитать при ограничениях (1 ≤ n, k ≤ 109)?
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 4009 |
2 | jiangly | 3823 |
3 | Benq | 3738 |
4 | Radewoosh | 3633 |
5 | jqdai0815 | 3620 |
6 | orzdevinwang | 3529 |
7 | ecnerwala | 3446 |
8 | Um_nik | 3396 |
9 | ksun48 | 3390 |
10 | gamegame | 3386 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 167 |
2 | Um_nik | 163 |
3 | maomao90 | 162 |
3 | atcoder_official | 162 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 156 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
9 | nor | 153 |
Есть задача в которой нужно посчитать некоторое значение выражения: ((kn + k^(n/2+n%2))/2)%109. Как это посчитать при ограничениях (1 ≤ n, k ≤ 109)?
Название |
---|
http://e-maxx.ru/algo/binary_pow
Нужно делить на 2 по модулю который не взаимно простой с 2-ой.
А, я гоню, да
можно посчитать значение выражения без деления на 2 по модулю 2*10^9, а потом уже разделить.
а в конце "тупо" делить на 2, или что нужно еще применять?
Меня это бесит. Люди минусуют пост чтобы он ушел с прямого эфира, хотя никто не может написать как решать эту задачу...
Дайте ссылку на задачу, может можно избавиться от деления на 2.
Меня это бесит. Нерейтинговые постят детские задачи в прямом эфире.
Да, на счет задачи, что мешает домножить отдельно на нужную степень двойки или считать все по модулю 2M, как написано ниже.
О, великий программист нашелся...
Где?
Разложим 10^9 на простые множители. Решим это сравнение по каждому из взаимно-простых модулей, а дальше воспользуемся КТО.
Ясно, что интересен только случай, когда рассматриваемый модуль — 2(2 входит в первой степени в разложении на простые 10^9). Но тогда в этом случае нам надо лишь найти ((k^n + k^(n/2+n%2)) по модулю 4, что сделать весьма просто.
BTW, 2 входит в 9 степени.
А я правильно понимаю, что (X / 2) % M = (X % (2*M)) / 2 ?
Посчитать по модулю 2·109, поделить результат на 2.
А почему это правильно?
Пусть мы посчитали 2x по модулю 2m, тогда мы знаем, что 2x = 2mq + r, где 0 ≤ r < 2m. Поделим всё на 2, получим x = mq + r / 2, 0 ≤ r / 2 < m, а это и означает, что остаток при делении x на m равен r / 2.