Pagini recente » Cod sursa (job #2374899) | Cod sursa (job #2434305) | Cod sursa (job #929712) | Cod sursa (job #3134197) | Cod sursa (job #2209282)
#include <fstream>
using namespace std;
ifstream cin ("cowfood.in");
ofstream cout ("cowfood.out");
const int NMAX = 20;
const int KMAX = 30;
const int SMAX = 10000;
const int MOD = 3210121;
int k, s, n;
int sol;
int solt[1 + NMAX];
int v[1 + NMAX][1 + KMAX];
int dp[1 + SMAX][1 + KMAX];
int Max[1 + NMAX][1 + KMAX];
void back(int niv) {
if(niv) {
for(int i = 1; i <= k; i++)
Max[niv][i] = max(Max[niv - 1][i], v[solt[niv]][i]);
int suma = 0;
for(int i = 1; i <= k; i++)
suma += Max[niv][i];
if(suma <= s) {
if(niv % 2 == 0)
sol = (sol + dp[s - suma][k]) % MOD;
else
sol = (sol - dp[s - suma][k]) % MOD;
}
}
if(niv < n) {
for(int i = solt[niv] + 1; i <= n; i++) {
solt[niv + 1] = i;
back(niv + 1);
}
}
}
int main() {
cin >> k >> s >> n;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= k; j++)
cin >> v[i][j];
}
for(int i = 0; i <= s; i++)
dp[i][1] = 1;
for(int j = 2; j <= k; j++) {
dp[0][j] = 1;
for(int i = 1; i <= s; i++)
dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % MOD;
}
for(int i = 1; i <= s; i++)
dp[i][k] = (dp[i][k] + dp[i - 1][k]) % MOD;
sol = (dp[s][k] - (s * k + 1) % MOD + MOD) % MOD;
back(0);
cout << sol;
return 0;
}