#include <bits/stdc++.h>
#define int long long
#define maxn 1010
#ifndef ONLINE_JUDGE
#define getchar_unlocked() getchar()
#endif
using namespace std;
int read() {
int x=0,flag=1;char c=getchar_unlocked();
while(c<'0'||c>'9') {if(c=='-')flag=-1;c=getchar_unlocked();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar_unlocked();}
return x*flag;
}
int n, m, mod;
int pnum[maxn], pri[maxn], ans[maxn];
int top = 0;
int exgcd(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1, y = 0;
return a;
}
int h = exgcd(b, a%b, y, x);
y -= a / b * x;
return h;
}
void excrt(int &a, int &mod, int aa, int mmod) {
int g = __gcd(mod, mmod);
int m = mod / g * mmod;
int p, q;
exgcd(mod / g, mmod / g, p, q);
p = p * mod % m * (aa - a) / g % m;
a = (a + p + m) % m;
mod = m;
}
int qpow(int a, int b, int m) {
int ans = 1, tmp = a;
while (b != 0) {
if(b & 1) {
ans = (ans % m * tmp % m) % m;
}
tmp = tmp * tmp % m;
b >>= 1;
}
return ans;
}
int qpow(int a, int b) {
int ans = 1, tmp = a;
while (b != 0) {
if(b & 1) {
ans = (ans * tmp);
}
tmp = tmp * tmp;
b >>= 1;
}
return ans;
}
int f(int n, int mod, int k) {//k 底数 n当前分解 mod 完整的模数(p^k)
if (n == 0) {
return 1;
}
int ans = 1;
for (int i = 1; i <= mod; i++) {
if (i % k != 0) {
ans = ans * i % mod;
}
}
// cerr << ans <<" " << n << " " << mod << " " << k << endl;
ans = qpow(ans, n / mod, mod);
for (int i = mod * (n / mod); i <= n; i++) {
if (i % k != 0) {
ans = ans * (i % mod) % mod;
}
}
ans = (ans * f(n / k, mod, k)) % mod;
return ans;
}
int g(int n, int k) {
if (n < k) {
return 0;
}
return g(n / k, k) + n / k;
}
int inv(int k, int mod) {
int x, y;
exgcd(k, mod, x, y);
return (x + mod) % mod;
}
int solve(int k, int mod) {
return f(n, mod, k) * inv(f(m, mod, k), mod) % mod * inv(f(n-m, mod, k), mod) % mod * qpow(k, g(n, k) - g(m, k) - g(n - m, k), mod) % mod;
}
signed main() {
n = read(); m = read(); mod = read();
int upp = sqrt(mod);
for (int i = 2; i <= upp; i++) {
if (mod % i == 0) {
++top;
pri[top] = i;
while (mod > 0 && mod % i == 0) {
pnum[top] ++;
mod /= i;
}
}
}
if (mod != 0) {
pri[++ top] = mod;
pnum[top] ++;
}
for (int i = 1; i <= top; i++) {
ans[i] = solve(pri[i], qpow(pri[i], pnum[i]));
}
int res = ans[1], resmod = qpow(pri[1], pnum[1]);
for (int i = 2; i <= top; i++) {
excrt(res, resmod, ans[i], qpow(pri[i], pnum[i]));
}
cout << res << endl;
return 0;
}
似乎是 f 函数炸掉了。