#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// Dùng kiểu long long cho N và P để đảm bảo đủ lớn
typedef long long ll;
void solve() {
ll N;
int M, K;
ll P;
// Đọc input: N, M, K, P
if (!(cin >> N >> M >> K >> P)) {
return;
}
// Pmax là tổng chênh lệch tối đa: (K-1) * M
int P_max = (K - 1) * M;
// DP: f[k][s] là số chuỗi k ngày có tổng chênh lệch s.
// Dùng vector 2D để lưu DP (k chỉ chạy đến K, s chỉ chạy đến P_max)
// Kích thước: (K+1) x (P_max + 1)
vector<vector<ll>> f(K + 1, vector<ll>(P_max + 1, 0));
// G[k][s] là tổng tiền tố: sum_{j=0}^{s} f[k][j]
vector<vector<ll>> G(K + 1, vector<ll>(P_max + 1, 0));
// --- 1. Trường hợp cơ sở: k=1 ---
// f[1][0] = 1 (chênh lệch 0)
f[1][0] = 1;
// G[1][s] = 1 cho s >= 0
for (int s = 0; s <= P_max; ++s) {
G[1][s] = 1;
}
// --- 2. Tính DP từ k=2 đến K ---
for (int k = 2; k <= K; ++k) {
// Tổng chênh lệch min: k-1
int s_min = k - 1;
// Tổng chênh lệch max: (k-1) * M
for (int s = s_min; s <= P_max; ++s) {
// Công thức truy hồi tối ưu: f[k][s] = G[k-1][s-1] - G[k-1][s-M-1]
// G[k-1][s-1]: tổng đến s-1
ll sum_upper = G[k - 1][s - 1];
// G[k-1][s-M-1]: tổng đến s-M-1
ll sum_lower = 0;
if (s - M - 1 >= 0) {
sum_lower = G[k - 1][s - M - 1];
}
// f[k][s] = (sum_upper - sum_lower) mod P
ll current_f = (sum_upper - sum_lower + P) % P;
f[k][s] = current_f;
// Cập nhật tổng tiền tố G[k][s]
G[k][s] = (G[k][s - 1] + f[k][s]) % P;
}
}
// --- 3. Tính kết quả cuối cùng ---
ll S0 = 0; // S0 = sum f[K][s]
ll S1 = 0; // S1 = sum s * f[K][s]
// Bắt đầu từ chênh lệch tối thiểu: K-1
int s_start = K - 1;
for (int s = s_start; s <= P_max; ++s) {
if (f[K][s] == 0) continue; // Bỏ qua nếu f[K][s] = 0
// Tính S0
S0 = (S0 + f[K][s]) % P;
// Tính S1 = sum s * f[K][s]
// (s * f[K][s]) mod P
ll term_s1 = ((ll)s % P) * (f[K][s] % P) % P;
S1 = (S1 + term_s1) % P;
}
// Công thức: Answer = (N * S0 - S1) mod P
// N mod P:
ll N_mod_P = N % P;
// (N_mod_P * S0) mod P
ll term_N_S0 = (N_mod_P * S0) % P;
// Answer = (term_N_S0 - S1 + P) mod P (Đảm bảo kết quả dương)
ll final_answer = (term_N_S0 - S1 + P) % P;
cout << final_answer << endl;
}
int main() {
// Tăng tốc độ I/O
ios_base::sync_with_stdio(false);
cin.tie(NULL);
solve();
return 0;
}