Pagini recente » Cod sursa (job #459180) | Cod sursa (job #261304) | Cod sursa (job #2869513) | Cod sursa (job #718336) | Cod sursa (job #39300)
Cod sursa(job #39300)
#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];
int num[MAX_K + 1][MAX_S + 1];
void read_in(int A[][MAX_K], int *K, int *S, int *N)
{
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 X[MAX_K], res;
void f(int X[], int k, int K, int s)
{
if (k < K) {
for (X[k] = 0; X[k] <= s; ++ X[k])
f(X, k + 1, K, s - X[k]);
} else
res = (res + 1) % modulo;
}
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;
// printf("%d\n", num[K][S]);
// f(X, 0, K, S), printf("%d\n", res);
}
int main(void)
{
freopen(iname, "r", stdin);
read_in(A, &K, &S, &N);
count(num, K, S);
int Res = num[K][S - 2] * K * (K - 1) / 2;
for (int step = 1; step < 1 << N; ++ step) {
int sgn = 0;
for (int i = 0; i < N; ++ i)
if (step & 1 << i) sgn ++;
sgn = (sgn & 1) ? -1 : +1;
int sum = 0;
int positive = 0;
for (int j = 0; j < K; ++ j) {
int max = 0;
for (int i = 0; i < N; ++ i)
if ((step & 1 << i) && (max < A[i][j]))
max = A[i][j];
if (max > 0)
positive ++, sum = sum + max;
}
if (positive == 0)
Res = Res + sgn * (num[K][S - 2] * K * (K - 1) / 2) % modulo;
else if (positive == 1)
Res = Res + sgn * (num[K][S - sum - 1] * (K - 1)) % modulo;
else if (positive > 1)
Res = Res + sgn * num[K][S - sum];
if (Res < 0)
Res += modulo;
else if (Res >= modulo)
Res -= modulo;
}
freopen(oname, "w", stdout);
printf("%d\n", Res);
return 0;
}