Есть задача в которой нужно посчитать некоторое значение выражения: ((kn + k^(n/2+n%2))/2)%109. Как это посчитать при ограничениях (1 ≤ n, k ≤ 109)?
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 3857 |
2 | jiangly | 3747 |
3 | orzdevinwang | 3706 |
4 | jqdai0815 | 3682 |
5 | ksun48 | 3591 |
6 | gamegame | 3477 |
7 | Benq | 3468 |
8 | Radewoosh | 3463 |
9 | ecnerwala | 3451 |
10 | heuristica | 3431 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 165 |
2 | -is-this-fft- | 161 |
3 | Qingyu | 160 |
4 | Dominater069 | 158 |
5 | atcoder_official | 157 |
6 | adamant | 155 |
7 | Um_nik | 151 |
8 | djm03178 | 150 |
8 | luogu_official | 150 |
10 | awoo | 148 |
Есть задача в которой нужно посчитать некоторое значение выражения: ((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.