То, что я подразумеваю под "большим n", - это что-то в миллионах. p является простым.
Я пробовал http://apps.topcoder.com/wiki/display/tc/SRM+467 Но функция кажется неправильной (я протестировал ее с помощью 144 select 6 mod 5, и он дает мне 0, когда он должен дать мне 2)
Я пробовал http://online-judge.uva.es/board/viewtopic.php?f=22&t=42690 Но я не понимаю его полностью
Я также сделал memoized рекурсивную функцию, которая использует логику (комбинации (n-1, k-1, p)% p + (n-1, k, p)% p), но она дает мне стек проблемы переполнения, поскольку n велико
Я пробовал теорему Лукаса, но он кажется медленным или неточным.
Все, что я пытаюсь сделать, это создать быстрый/точный n выбрать k mod p для больших n. Если бы кто-нибудь мог помочь показать мне хорошую реализацию, я был бы очень благодарен. Спасибо.
В соответствии с запросом memoized версия, которая поражает переполнение стека для больших n:
std::map<std::pair<long long, long long>, long long> memo;
long long combinations(long long n, long long k, long long p){
if (n < k) return 0;
if (0 == n) return 0;
if (0 == k) return 1;
if (n == k) return 1;
if (1 == k) return n;
map<std::pair<long long, long long>, long long>::iterator it;
if((it = memo.find(std::make_pair(n, k))) != memo.end()) {
return it->second;
}
else
{
long long value = (combinations(n-1, k-1,p)%p + combinations(n-1, k,p)%p)%p;
memo.insert(std::make_pair(std::make_pair(n, k), value));
return value;
}
}