1. Lucas
ll fac[N]; void N_() { fac[0]=1; for(ll i=1;i<N;i++) fac[i]=fac[i-1]*i%mod; } ll quick_mod(ll a,ll b,ll mo){ll ans=1;for(;b;b>>=1,a=a*a%mo)if(b&1)ans=ans*a%mo;return ans; } ll C(ll n, ll m) { if(m > n) return 0; return fac[n]*quick_mod(fac[m]*fac[n-m],mod-2)%mod; } ll Lucas(ll n, ll m) { if(!m) return 1; return C(n % mod, m % mod) * Lucas(n / mod, m / mod) % mod; } //C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)
2.EXLucas
#include <cstdio> #include <algorithm> #include <cstring> #include <iostream> #include <climits> #include <cmath> using namespace std; namespace Lucas { const int N = 1e6; typedef long long ll; ll n, m, p; inline ll power(ll a, ll b, ll p) { ll ans = 1; while (b) { if (b & 1) ans = ans * a % p; a = a * a % p; b >>= 1; } return ans; } ll fac(const ll n, const ll p, const ll pk) { if (!n) return 1; ll ans = 1; for (int i = 1; i < pk; i++) if (i % p) ans = ans * i % pk; ans = power(ans, n / pk, pk); for (int i = 1; i <= n % pk; i++) if (i % p) ans = ans * i % pk; return ans * fac(n / p, p, pk) % pk; } ll exgcd(const ll a, const ll b, ll &x, ll &y) { if (!b) { x = 1, y = 0; return a; } ll xx, yy, g = exgcd(b, a % b, xx, yy); x = yy; y = xx - a / b * yy; return g; } ll inv(const ll a, const ll p) { ll x, y; exgcd(a, p, x, y); return (x % p + p) % p; } ll C(const ll n, const ll m, const ll p, const ll pk) { if (n < m) return 0; ll f1 = fac(n, p, pk), f2 = fac(m, p, pk), f3 = fac(n - m, p, pk), cnt = 0; for (ll i = n; i; i /= p) cnt += i / p; for (ll i = m; i; i /= p) cnt -= i / p; for (ll i = n - m; i; i /= p) cnt -= i / p; return f1 * inv(f2, pk) % pk * inv(f3, pk) % pk * power(p, cnt, pk) % pk; } ll a[N], c[N]; int cnt; inline ll CRT() { ll M = 1, ans = 0; for (int i = 0; i < cnt; i++) M *= c[i]; for (int i = 0; i < cnt; i++) ans = (ans + a[i] * (M / c[i]) % M * inv(M / c[i], c[i]) % M) % M; return ans; } ll exlucas(const ll n, const ll m, ll p) { ll tmp = sqrt(p); for (int i = 2; p > 1 && i <= tmp; i++) { ll tmp = 1; while (p % i == 0) p /= i, tmp *= i; if (tmp > 1) a[cnt] = C(n, m, i, tmp), c[cnt++] = tmp; } if (p > 1) a[cnt] = C(n, m, p, p), c[cnt++] = p; return CRT(); } int solve() { ios::sync_with_stdio(false); cin >> n >> m >> p; cout << exlucas(n, m, p); return 0; } } int main(){return Lucas::solve();}