【模板】 Lucas

 CODE:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<queue>
 6 #define ms(a,b) memset(a,b,sizeof a)
 7 #define rep(i,a,n) for(int i = a;i <= n;i++)
 8 #define per(i,n,a) for(int i = n;i >= a;i--)
 9 #define inf 2147483647
10 using namespace std;
11 typedef long long ll;
12 ll read() {
13     ll as = 0,fu = 1;
14     char c = getchar();
15     while(c < '0' || c > '9') {
16     if(c == '-') fu = -1;
17     c = getchar();
18     }
19     while(c >= '0' && c <= '9') {
20     as = as * 10 + c - '0';
21     c = getchar();
22     }
23     return as * fu;
24 }
25 const int N = 100005;
26 //head
27 ll n,m,p;
28 ll fac[N],inv[N];
29 ll ksm(ll a,ll b) {
30     ll tmp = 1;
31     while(b) {
32     if(b & 1) tmp = tmp * a % p;
33     a = a * a % p;
34     b >>= 1;
35     }
36     return tmp;
37 }
38 
39 void initfac() {
40     fac[0] = fac[1] = inv[0] = inv[1] = 1;
41     rep(i,2,p-1) fac[i] = fac[i-1] * i % p;
42     inv[p-1] = ksm(fac[p-1],p-2);
43     per(i,p-2,2) inv[i] = inv[i+1] * (i+1) % p;
44 }
45 
46 ll C(ll n,ll m) {
47     return fac[n] * inv[n-m] % p * inv[m] % p;
48 }
49 ll Lucas(ll x,ll y) {
50     if(!x) return 1;
51     if(x > y) return 0;
52     if(y < p) return fac[y] * inv[y-x] % p * inv[x] % p;
53     return Lucas(x/p,y/p) * Lucas(x%p,y%p) % p;
54 }
55 
56 void solve() {
57     n = read();
58     m = read();
59     p = read();
60     initfac();
61     printf("%lld\n",Lucas(m,n+m));
62 }
63 
64 int main() {
65     int T = read();
66     while(T--) solve();
67 }

 

posted @ 2018-10-03 22:36  白怀潇  阅读(110)  评论(0)    收藏  举报