Pagini recente » Cod sursa (job #3150912) | Cod sursa (job #1302746) | Cod sursa (job #2743579) | Cod sursa (job #2510940) | Cod sursa (job #21853)
Cod sursa(job #21853)
#include <stdio.h>
#define MAXK 31
#define MAXN 21
#define MAXS 10001
#define MOD 3210121
int K, S, N, NR;
int x[MAXK][MAXK];
int nr[MAXK][MAXS];
int st[MAXN], sts[MAXN][MAXK];
inline int max( int a, int b )
{
return a > b ? a : b;
}
void back(int k, int Nr, int type)
{
int i, j;
if (k == Nr)
{
int Sst = 0;
for (i = 0; i < K; i++)
Sst += sts[k][i];
if (Sst > S)
return;
NR += type * nr[K][S - Sst];
if (NR >= MOD)
NR -= MOD;
return;
}
for (i = k ? (st[k - 1] + 1) : 0; i < N; i++)
{
for (j = 0; j < K; j++)
sts[k + 1][j] = max( sts[k][j], x[i][j] );
st[k] = i;
back(k + 1, Nr, type);
}
}
int main()
{
freopen("cowfood.in", "rt", stdin);
freopen("cowfood.out", "wt", stdout);
scanf("%d %d %d", &K, &S, &N);
int i, j;
for (i = 0; i < N; i++)
for (j = 0; j < K; j++)
scanf("%d", x[i] + j);
if (S < K)
{
printf("0\n");
return 0;
}
//nr[i][j] = nr de posibilitati de a adauga cel mult j unitati la i intregi
for (i = 0; i <= S; i++)
nr[1][i] = i + 1;
for (i = 2; i <= K; i++)
for (nr[i][0] = j = 1; j <= S; j++)
{
nr[i][j] = nr[i - 1][j] + nr[i][j - 1];
if (nr[i][j] >= MOD)
nr[i][j] -= MOD;
}
NR = nr[K][S - K];
for (i = 1; i <= N; i++)
if (i & 1)
back(0, i, -1);
else
back(0, i, 1);
printf("%d\n", NR);
return 0;
}