Задача
Николаю нужно доставить подарки для [latex]n[/latex] [latex](n ≤ 10^{18})[/latex] детей. Его интересует сколькими способами он может это сделать. Вам нужно дать ответ на этот простой вопрос. Так как это количество может быть очень большим, выведите результат по модулю [latex]m[/latex] [latex](m ≤ 2009)[/latex].
Входные данные
В одной строке заданы два натуральных числа [latex]n[/latex] и [latex]m[/latex].
Выходные данные
Вывести искомое количество способов.
Тесты
Входные данные | Выходные данные |
[latex]500[/latex] [latex]2001[/latex] | [latex]0[/latex] |
[latex]4[/latex] [latex]5[/latex] | [latex]4[/latex] |
[latex]4[/latex] [latex]7[/latex] | [latex]3[/latex] |
[latex]15[/latex] [latex]213[/latex] | [latex]147[/latex] |
[latex]10[/latex] [latex]3[/latex] | [latex]0[/latex] |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> using namespace std; int main() { int n, m, k = 1; cin >> n >> m; if ( n >= m) { cout << 0; } else { for ( int i = 2; i <= n; i++ ) { k = ( k * i ) % m; } cout << k; } return 0; } |
Решение задачи
Если [latex]m[/latex] является членом произведения [latex]n![/latex], то остаток от деления на [latex]m[/latex] равен [latex]0[/latex].В остальных случаях ищем [latex]n![/latex] с вычислением остатка от деления после каждого перемножения.
Ссылки
Условие задачи на e-olymp.com.
Код решения на ideone.com.
Спасибо все учту, но я не списывал, я подумал какие могут быть еще алгоритмы и придумал один, но не был в нем уверен, а потом нашел его на этом сайте и воспользовался. Сделаю по-другому.
Странно, а я увидел скопированный буква в букву код.
Молодец. Все четко и ясно.
Правда код я бы написал чуть иначе, но и так зачтено.