Pagini recente » Cod sursa (job #2587894) | Cod sursa (job #836242) | Cod sursa (job #1843968) | Cod sursa (job #2464631) | Cod sursa (job #1757413)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
const int NMAX = 21, KMAX = 31, SMAX = 10001;
const int MOD = 3210121;
int K, S, N, V, E;
int M[NMAX][KMAX], x[NMAX], MAX[NMAX][KMAX], SCOMB[KMAX][SMAX];
void calcSumComb()
{
for(int i = 0; i <= S; i++)
SCOMB[0][i] = 1;
for(int i = 1; i <= K; i++)
{
SCOMB[i][0] = 1;
for(int j = 1; j <= S; j++)
{
SCOMB[i][j] = (SCOMB[i - 1][j] + SCOMB[i][j - 1]) % MOD;
}
}
}
void genSubm(int n, int m)
{
int semn, k = 1, i;
x[1] = 0;
if(m % 2 == 0) semn = -1;
else semn = 1;
while(k > 0)
if(x[k] < n - m + k)
{
x[k]++;
for(i = 1; i <= K; i++)
MAX[k][i] = max(MAX[k - 1][i], M[x[k]][i]);
if(k == m)
{
int sum = 0;
for(i = 1; i <= K; i++)
sum += MAX[m][i];
if(sum <= S)
{
E += MOD + semn * SCOMB[K][S - sum];
E %= MOD;
}
}
else
{
k++;
x[k] = x[k - 1];
}
}
else
k--;
}
int main()
{
f >> K >> S >> N;
calcSumComb();
for(int i = 1; i <= N; i++)
for(int j = 1; j <= K; j++)
f >> M[i][j];
E = 0;
for(int i = 1; i <= N; i++)
genSubm(N, i);
V = SCOMB[K][S] + (MOD - S * K - 1);
V %= MOD;
V += MOD - E;
V %= MOD;
g << V;
f.close();
g.close();
return 0;
}