rt,可能是是哪里死循环了
ll n, m, p;
ll exgcd (ll a, ll b, ll &x, ll &y)
{
if (!b)
{
x = 1, y = 0;
return a;
}
ll gcd = exgcd (b, a % b, y, x);
y -= a / b * x;
return gcd;
}
ll Inv (ll a, ll p)
{
ll x, y;
exgcd (a, p, x, y);
return (x + p) % p;
}
ll CRT (ll a, ll b, ll p) { return (p / b) * a * Inv(p / b, b) % p;}
ll F(ll x, ll p) { return x >= p? F(x / p, p) + x / p: 0;}
ll qpow(ll a, ll b, ll p)
{
ll ans = 1;
for (; b; b >>= 1, (a *= a) %= p)
if (b & 1) (ans *= a) %= p;
return ans;
}
ll G(ll n, ll p, ll pk)
{
if (!n) return 1;
ll ans = 1;
for (int i = 2; i <= pk; i++)
if (i % p) (ans *= i) %= pk;
ans = qpow(ans, n / pk, pk);
for (int i = pk * (n / pk); i <= n; i++)
if (i % p) (ans *= i % pk) %= pk;
return G(n / p, p, pk) * ans % pk;
}
ll C(ll n, ll m, ll p, ll pk) {return G(n, p, pk) * Inv(G(n - m, p, pk), pk) % pk * Inv(G(m, p, pk), pk) % pk * qpow(p, F(n, p) - F(m, p) - F(n - m, p), pk) % pk;}
ll exLucas (ll n, ll m, int p)
{
ll t = p, ans = 0;
for (int i = 2; i * i <= p; i++)
{
if (t % i) continue;
ll pk = 1;
while (!(t % i)) pk *= i, t /= i;
(ans += CRT(C(n, m, i, pk), pk, p)) %= p;
}
if (t > 1) (ans += CRT(C(n, m, t, t), t, p)) %= p;
return ans % p;
}
int main()
{
scanf ("%lld%lld%lld", &n, &m, &p);
printf ("%lld", exLucas(n, m, p));
return 0;
}