#include <bits/stdc++.h>
#define int __int128
using namespace std;
namespace IO {
inline char gc() {
static const int IN_LEN = 1 << 18 | 1;
static char buf[IN_LEN], *s, *t;
return (s == t) && (t = (s = buf) + fread(buf, 1, IN_LEN, stdin)), s == t ? -1 : *s++;
}
template <typename T>
inline void read(T &x) {
static char ch, ff;
ch = gc(), ff = 0;
for(; !isdigit(ch); ch = gc())
ff |= ch == '-';
for(x = 0; isdigit(ch); ch = gc())
x = (x << 3) + (x << 1) + (ch ^ 48);
ff && (x = -x);
return;
}
template <typename T, typename ...t>
void read(T&x, t& ...y) {
read(x), read(y...);
return;
}
template <typename T>
inline void print(T x) {
static int pr, pri[105], temp;
pr = 0, temp = x;
if(x < 0)
fputc('-', stdout), x = -x;
if(!x) {
fputc(48, stdout);
return;
}
while(x)
pri[++pr] = x % 10, x /= 10;
for(; pr; pr--)
fputc(pri[pr] + 48, stdout);
x = temp;
return;
}
template <typename T, typename ...t>
void print(T&x, t& ...y) {
print(x), fputc(' ', stdout), print(y...);
return;
}
}
using namespace IO;
struct node {
int x, m;
}a[1000005];
int n, m, mod;
vector<node> p;
int fpow(int x, int y, int mod) {
int s = 1;
while(y) {
if(y & 1)
s = s * x % mod;
x = x * x % mod, y >>= 1;
}
return s;
}
int exgcd(int a, int b, int &x, int &y) {
if(!b) {
x = 1, y = 0;
return a;
}
int tmp = exgcd(b, a % b, x, y), p = x;
x = y, y = p - a / b * y;
return tmp;
}
int Inv(int a, int mod) {
int x, y;
exgcd(a, mod, x, y);
return (x + mod) % mod;
}
int f(int x, int p, int mod) {
if(!x)
return 1;
int s1 = 1, s2 = 1;
for(int i = 1; i < mod; i++)
if(i % p)
s1 = s1 * i % mod;
for(int i = n / mod * mod; i <= n; i++)
if(i % p)
s2 = s2 * i % mod;
return f(x / p, p, mod) * fpow(s1, n / mod, mod) % mod * s2 % mod;
}
int g(int x, int p) {
if(x < p)
return 0;
return x / p + g(x / p, p);
}
node calc(int p, int mod) {
return {(f(n, p, mod) * Inv(f(m, p, mod), mod) % mod * Inv(f(n - m, p, mod), mod) % mod * fpow(p, g(n, p) - g(m, p) - g(n - m, p), mod) % mod + mod) % mod, mod};
}
node merge(int a, int m, int a2, int m2) {
int x, y, g = exgcd(m, m2, x, y), mod = m / g * m2;
return {(a + (a2 - a) / g * x % mod * m % mod + mod) % mod, mod};
}
signed main() {
read(n, m, mod);
for(int i = 2; i * i <= mod; i++)
if(!(mod % i)) {
int s = 1;
while(!(mod % i))
s *= i, mod /= i;
p.push_back({i, s});
}
if(mod ^ 1)
p.push_back({mod, mod});
for(int i = 0; i < p.size(); i++)
a[i] = calc(p[i].x, p[i].m);
for(int i = 1; i < p.size(); i++)
a[0] = merge(a[0].x, a[0].m, a[i].x, a[i].m);
print(a[0].x);
return 0;
}