lucas定理

记一下结论:

当p为质数时,C(n, a) = C(n % p, a % p) * C(n / p, a / p) (mod p)

 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 }
AC代码

复杂度O(p + logn)


exlucas就是把模数拆了,然后CRT合并。

以后来填。

posted @ 2018-11-29 19:06  huyufeifei  阅读(150)  评论(0编辑  收藏  举报
试着放一个广告栏(虽然没有一分钱广告费)

『Flyable Heart 応援中!』 HHG 高苗京铃 闪十PSS 双六 電動伝奇堂 章鱼罐头制作组 はきか 祝姬 星降夜