卢卡斯定理
Posted kasenbob
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了卢卡斯定理相关的知识,希望对你有一定的参考价值。
(说实话推断过程不是我这种弱鸡能看懂的,直接上结论。。。)
卢卡斯定理:
C(n, m) % p = (C(n/p, m/p) % p) * (C(n%p, m%p) % p) % p
#include <cstdio> #include <cctype> #include <cstring> #include <algorithm> using namespace std; typedef long long u64; const int maxn = 100000 + 10; u64 n, m, p, fac[maxn]; inline u64 Fast_Pow(u64 x, u64 k) { u64 ans = 1; while(k) { if( k&1 ) ans = ans * x % p; k >>= 1, x = x * x % p; } return ans; } u64 C(u64 k, u64 b) { if( k<b ) return 0; return fac[k] * Fast_Pow(fac[b] % p, p-2) % p * Fast_Pow(fac[k-b] % p, p-2) % p; } u64 Lucas(u64 k, u64 b) { if( !b ) return 1; return C(k%p, b%p) * Lucas(k/p, b/p) % p; } int main(int argc, char const *argv[]) { int t; scanf("%d", &t); while( t-- ) { fac[0] = 1; scanf("%lld%lld%lld", &n, &m, &p); for(int i=1; i<=p; ++i) fac[i] = fac[i-1] * i % p; printf("%lld ", Lucas(n+m, m)); } return 0; }
以上是关于卢卡斯定理的主要内容,如果未能解决你的问题,请参考以下文章