Pagini recente » Cod sursa (job #752821) | Cod sursa (job #2510225) | Cod sursa (job #1156541) | Cod sursa (job #8536) | Cod sursa (job #39760)
Cod sursa(job #39760)
#include <cstdio>
using namespace std;
const char iname[] = "cowfood.in";
const char oname[] = "cowfood.out";
#define MAX_N 20
#define MAX_K 30
#define MAX_S 10000
#define modulo 3210121
int K, S, N;
int A[MAX_N][MAX_K];
void read_in(void)
{
scanf("%d %d", & K, & S);
int i;
int j;
for (scanf("%d", & N), i = 0; i < N; ++ i)
for (j = 0; j < K; ++ j)
scanf("%d", A[i] + j);
}
int V[MAX_N], X[MAX_N], Res, sgn, cnt;
int solve(int sum, int i)
{
if (i < K) {
for (V[i] = X[i]; V[i] <= X[i] + sum; ++ V[i])
solve(sum - (V[i] - X[i]), i + 1);
} else if (i == K) {
for (int j = cnt = 0; j < K; ++ j)
if (V[j] > 0) cnt ++;
if (cnt > 1) {
Res = (Res + sgn) % modulo;
if (Res < 0)
Res = Res + modulo;
}
}
}
int main(void)
{
freopen(iname, "r", stdin);
freopen(oname, "w", stdout);
read_in();
for (int stp = 0; stp < 1 << N; ++ stp) {
sgn = 0;
for (int i = 0; i < N; ++ i)
if (stp & 1 << i) sgn ++;
sgn = (sgn & 1) ? (-1) : (+1);
for (int j = 0; j < K; ++ j)
X[j] = 0;
for (int i = 0; i < N; ++ i) {
if (stp & 1 << i)
for (int j = 0; j < K; ++ j)
if (X[j] < A[i][j]) X[j] = A[i][j];
}
int sum = 0;
for (int j = 0; j < K; ++ j)
sum = sum + X[j];
solve(S - sum, 0);
}
printf("%d\n", Res);
return 0;
}