【模板】 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 }
> 别忘了 总有人在等着你

浙公网安备 33010602011771号