Pagini recente » Cod sursa (job #856906) | Cod sursa (job #1314744) | Cod sursa (job #2199517) | Cod sursa (job #865155) | Cod sursa (job #1757114)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
const int MOD = 3210121;
int K, S, N, V, E;
int M[21][31], x[21], MAX[21][31], scomb[31][10001];
void suma_combinari()
{
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];
}
return;
}
void maxv(int A[], int B[], int C[])
{
for(int i = 1; i <= K; i++)
C[i] = max(A[i], B[i]);
}
void gen_comb(int n, int m)
{
int k = 1;
x[1] = 0;
int semn;
if(m % 2 != 0) semn = 1;
else semn = -1;
while(k > 0)
if(x[k] < n - m + k)
{
x[k]++;
maxv(MAX[k - 1], M[k], MAX[k]);
if(k == m)
{
int D = S;
for(int i = 1; i <= K; i++)
D -= MAX[m][i];
E += semn * scomb[K][D];
E %= MOD;
}
else
{
k++;
x[k] = x[k - 1];
}
}
else
k--;
}
int main()
{
f >> K >> S >> N;
suma_combinari();
for(int i = 1; i <= N; i++)
for(int j = 1; j <= K; j++)
f >> M[i][j];
for(int i = 1; i <= N; i++)
gen_comb(N, i);
V = scomb[K][S] - S * K - E - 1;
V %= MOD;
while (V < 0) V += MOD;
g << V;
return 0;
}