#include <bits/stdc++.h>
using namespace std;
#define MOEZ ios_base::sync_with_stdio(false);cin.tie(NULL),cout.tie(NULL);
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
#define F first
#define S second
#define pb push_back
#define all(v) v.begin() , v.end()
#define eb emplace_back
#define getunique(v) {sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end());}
#define mem(d , x) memset(d , x , sizeof(d));
#define sz(x) (int)x.size()
const int N = 1e3+5;
//const int M = 1e9+7;
//const ll inf = 1e18;
//const ld eps = 1e-6;
#define int long long
int n , m , b , M , a[501];
int dp[2][501][501];
signed main(){
MOEZ
cin >> n >> m >> b >> M;
for(int i = 0; i < n;i++){
cin >> a[i];
}
dp[0][0][0] = 1;
bool f = true;
for(int i = 0; i < n;i++){
for(int j = 0; j <= m;j++){
for(int k = 0; k <= b;k++){
dp[f][j][k] = dp[(f^1)][j][k];
if(j && k-a[i] >= 0){
dp[f][j][k] += dp[f][j-1][k-a[i]];
}
dp[f][j][k] %= M;
}
}
f ^= 1;
}
int ans = 0;
for(int i = 0; i <= b;i++){
ans += dp[(f^1)][m][i];
ans %= M;
}
cout << ans;
}
1330A - Dreamoon and Ranking Collection | 1692B - All Distinct |
1156C - Match Points | 1675A - Food for Animals |
1328C - Ternary XOR | 1689A - Lex String |
1708B - Difference of GCDs | 863A - Quasi-palindrome |
1478A - Nezzar and Colorful Balls | 1581B - Diameter of Graph |
404A - Valera and X | 908A - New Year and Counting Cards |
146A - Lucky Ticket | 1594C - Make Them Equal |
1676A - Lucky | 1700B - Palindromic Numbers |
702C - Cellular Network | 1672C - Unequal Array |
1706C - Qpwoeirut And The City | 1697A - Parkway Walk |
1505B - DMCA | 478B - Random Teams |
1705C - Mark and His Unfinished Essay | 1401C - Mere Array |
1613B - Absent Remainder | 1536B - Prinzessin der Verurteilung |
1699B - Almost Ternary Matrix | 1545A - AquaMoon and Strange Sort |
538B - Quasi Binary | 424A - Squats |