Pagini recente » Cod sursa (job #2043577) | Cod sursa (job #561304) | Cod sursa (job #2183081) | Cod sursa (job #1573904) | Cod sursa (job #3289384)
#include <fstream>
using namespace std;
const int MOD = 3210121;
const int NMAX = 21;
const int KMAX = 31;
const int SMAX = 10001;
int K, S, N, V, E;
int M[NMAX][KMAX], x[NMAX], MAX[NMAX][KMAX], SCOMB[SMAX];
ifstream f("cowfood.in");
ofstream g("cowfood.out");
void calcSumComb() {
for (int i = 0; i <= S; ++i) {
SCOMB[i] = 1;
}
for (int i = 1; i <= K; ++i) {
for (int j = 1; j <= S; ++j) {
SCOMB[j] += SCOMB[j - 1];
SCOMB[j] %= MOD;
}
}
}
void bt(int k) {
for (int i = x[k - 1] + 1; i <= N; ++i) {
int sum = 0;
for (int j = 1; j <= K; ++j) {
MAX[k][j] = max(MAX[k - 1][j], M[i][j]);
sum += MAX[k][j];
}
if (sum <= S) {
if (k % 2 != 0) {
E += SCOMB[S - sum];
if (E >= MOD) E -= MOD;
} else {
E -= SCOMB[S - sum];
if (E < 0) E += MOD;
}
x[k] = i;
bt(k + 1);
}
}
}
int main() {
f >> K >> S >> N;
for (int i = 1; i <= N; ++i) {
for (int j = 1; j <= K; ++j) {
f >> M[i][j];
}
}
calcSumComb();
bt(1);
V = SCOMB[S] - S * K - 1 - E;
V %= MOD;
if (V < 0) V += MOD;
g << V;
f.close();
g.close();
return 0;
}