template <classT> inlinevoidchmin(T &x, const T &y){ if (x > y) { x = y; } } template <classT> inlinevoidchmax(T &x, const T &y){ if (x < y) { x = y; } }
constint N = 200100;
int n, m, mod;
inlinevoidadd(int &x, constint &y){ x += y; if (x >= mod) { x -= mod; } } inlinevoiddec(int &x, constint &y){ x -= y; if (x < 0) { x += mod; } } inlineintnorm(int x){ x %= mod; return x < 0 ? x + mod : x; }
constexprintqpow(int a, int b, int p){ int ans = 1; for (; b; b >>= 1) { if (b & 1) ans = 1ll * ans * a % p; a = 1ll * a * a % p; } return ans; }
int im;
int power[N], pre[N]; int s0[N], s1[N];
voidwork(){ std::cin >> n >> m >> mod;
im = qpow(m, mod - 2, mod);
power[0] = 1; for (int i = 1; i <= n; i ++) { power[i] = 1ll * power[i - 1] * im % mod; }
pre[0] = 1; for (int i = 1; i <= n; i ++) { add(pre[i] = pre[i - 1], power[i]); }
s0[0] = 0; for (int i = 1; i <= n; i ++) { add(s0[i] = s0[i - 1], 1ll * power[i] * i % mod); }
s1[0] = 0; for (int i = 1; i <= n; i ++) { add(s1[i] = s1[i - 1], 1ll * power[i] * (i - 1) % mod); }
int ans1 = 0, ans2 = 0, sum = 0; for (int i = 1; i <= n; i ++) { // 0~u int u = std::min(i - 1, n - i); int cur = pre[u];
add(ans1, cur); add(ans2, s0[u]);
add(ans2, 1ll * cur * sum % mod); add(sum, cur); } for (int i = 1; i < n; i ++) { // 1~u int u = std::min(i, n - i); int cur = norm(pre[u] - 1);
add(ans1, cur); add(ans2, s1[u]);
add(ans2, 1ll * cur * sum % mod); add(sum, cur); }
int ans = (ans1 + 2ll * ans2) % mod; std::cout << ans << '\n'; }