Pagini recente » Cod sursa (job #2394442) | Cod sursa (job #2260955) | Cod sursa (job #418773) | Cod sursa (job #2729797) | Cod sursa (job #42900)
Cod sursa(job #42900)
#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
const int modulo = 3210121;
int K, S, N;
int A[MAX_N][MAX_K];
int num[MAX_K + 1][MAX_S + 1];
int Res;
void read_in(int A[][MAX_K], int * K, int * S, int * N)
{
scanf("%d", K);
scanf("%d", S);
scanf("%d", N);
for (int i = 0; i < *N; ++ i)
for (int j = 0; j < *K; ++ j) scanf("%d", A[i] + j);
}
void count(int num[][MAX_S + 1], int K, int S)
{
for (int j = 0; j <= S; ++ j)
num[1][j] = 1;
for (int i = 2; i <= K; ++ i) {
num[i][0] = 1;
for (int j = 1; j <= S; ++ j)
num[i][j] = (num[i][j - 1] + num[i - 1][j]) % modulo;
}
for (int i = 1; i <= K; ++ i) {
for (int j = 1; j <= S; ++ j)
num[i][j] = (num[i][j] + num[i][j - 1]) % modulo;
}
}
void f(int X[], int K, int S, int N, int i, int sgn)
{
if (i < N) {
f(X, K, S, N, i + 1, sgn);
int T[MAX_K];
for (int j = 0; j < K; ++ j) {
T[j] = X[j];
if (X[j] < A[i][j])
X[j] = A[i][j];
}
f(X, K, S, N, i + 1, sgn == +1 ? -1 : +1);
for (int j = 0; j < K; ++ j)
X[j] = T[j];
} else if (i == N) {
int sum = 0;
int cnt = 0;
for (int j = 0; j < K; ++ j) {
if (X[j] > 0)
cnt ++, sum = sum + X[j];
}
if (S < sum) return ;
if (cnt == 0)
Res = Res + sgn * (num[K][S] - 1 - K * S);
else if (cnt == 1)
Res = Res + sgn * (num[K][S - sum] - (S - sum + 1));
else if (cnt > 1)
Res = Res + sgn * (num[K][S - sum]);
Res = Res % modulo;
}
}
int main(void)
{
freopen(iname, "r", stdin);
read_in(A, &K, &S, &N);
count(num, K, S);
int X[MAX_K] = {0};
freopen(oname, "w", stdout);
f(X, K, S, N, 0, +1);
if (Res < 0) Res = Res + modulo;
printf("%d\n", Res);
return 0;
}