Pagini recente » Cod sursa (job #1610094) | Cod sursa (job #1775806) | Cod sursa (job #2809569) | Cod sursa (job #1594667) | Cod sursa (job #2297341)
#include <bits/stdc++.h>
using namespace std;
const int MOD = 3210121;
int n, s, k, C[10045][35], a[25][35], sum, cnt, mx[35], prevMax[25][35];
long long rs;
bool viz[25];
void back(int curr, int cnt) {
if (curr == n + 1) {
int sum = 0;
for (int i = 1; i <= k; i++) {
sum += mx[i];
}
if (sum > s) return ;
int mult = (cnt % 2 == 0) - (cnt % 2 == 1);
int rez = 0;
for (int i = 0; i <= s - sum; i++) {
rez = C[i + k - 1][k - 1];
rs += 1LL * mult * rez;
rs %= MOD;
}
} else {
back(curr + 1, cnt);
for (int i = 1; i <= k; i++) {
prevMax[curr][i] = mx[i];
mx[i] = max(mx[i], a[curr][i]);
}
back(curr + 1, cnt + 1);
for (int i = 1; i <= k; i++) {
mx[i] = prevMax[curr][i];
}
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
ifstream cin("cowfood.in");
ofstream cout("cowfood.out");
cin >> k >> s >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k; j++) {
cin >> a[i][j];
}
}
C[0][0] = C[1][0] = C[1][1] = 1;
for (int i = 0; i <= k; i++) {
for (int j = 1; j <= s + k; j++) {
C[j][0] = 1;
C[j][i] = (C[j - 1][i - 1] + C[j - 1][i]) % MOD;
}
}
back(1, 0);
rs = rs - k * s - 1;
rs %= MOD;
cout << rs;
return 0;
}