lucas定理
记一下结论:
当p为质数时,C(n, a) = C(n % p, a % p) * C(n / p, a / p) (mod p)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 3 typedef long long LL; 4 const int N = 100010; 5 6 LL inv[N], nn[N], invn[N]; 7 8 inline void getinv(int p) { 9 inv[1] = 1; 10 for(int i = 2; i < p; i++) { 11 inv[i] = (p - (p / i)) * inv[p % i] % p; 12 } 13 return; 14 } 15 16 LL C(LL a, LL b, LL c) { 17 return nn[a] * invn[b] % c * invn[a - b] % c; 18 } 19 LL lucas(LL a, LL b, LL c) { 20 if(!b) { 21 return 1; 22 } 23 return C(a % c, b % c, c) * lucas(a / c, b / c, c) % c; 24 } 25 26 inline void solve() { 27 LL n, m, p; 28 scanf("%lld%lld%lld", &n, &m, &p); 29 30 getinv(p); 31 for(int i = 1; i <= p; i++) { 32 invn[i] = invn[i - 1] * inv[i] % p; 33 nn[i] = nn[i - 1] * i % p; 34 } 35 36 LL ans = lucas(m + n, n, p); 37 printf("%lld\n", ans); 38 return; 39 } 40 41 int main() { 42 nn[0] = invn[0] = 1; 43 int T; 44 scanf("%d", &T); 45 while(T--) { 46 solve(); 47 } 48 49 return 0; 50 }
复杂度O(p + logn)
exlucas就是把模数拆了,然后CRT合并。
以后来填。