Pagini recente » Cod sursa (job #407564) | Cod sursa (job #2023518) | Cod sursa (job #2012513) | Cod sursa (job #2493984) | Cod sursa (job #1761568)
#include <iostream>
#include <fstream>
using namespace std;
const int MOD = 3210121;
int K, S, N;
int V, E;
int M[21][31], x[21], MAX[21][31], scomb[10001];
void euclidExt(int a, int b, int &d, int &x, int &y)
{
int x1 = 0, y1 = 1;
x = 1, y = 0;
while(b != 0)
{
int q = a / b;
int r = a % b;
a = b;
b = r;
int x0 = x - x1 * q;
int y0 = y - y1 * q;
x = x1;
y = y1;
x1 = x0;
y1 = y0;
}
d = a;
}
int inversMod(int a)
{
int d, x, y;
euclidExt(a, MOD, d, x, y);
x %= MOD;
if(x < 0) x += MOD;
return x;
}
void sumComb()
{
scomb[0] = 1;
long long c = 1;
for(int i = 0; i < S; i++)
{
c *= (i + K);
c %= MOD;
c *= inversMod(i + 1);
c %= MOD;
scomb[i + 1] = scomb[i] + c;
scomb[i + 1] %= MOD;
}
return;
}
void maxv(int A[], int B[], int C[])
{
for(int i = 1; i <= K; i++)
C[i] = max(A[i], B[i]);
}
void genComb(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[x[k]], MAX[k]);
if(k == m)
{
int D = S;
for(int i = 1; i <= K; i++)
D -= MAX[m][i];
int t = MOD + semn * scomb[D];
E += t;
E %= MOD;
}
else
{
k++;
x[k] = x[k - 1];
}
}
else
k--;
}
int main()
{
ifstream f("cowfood.in");
ofstream g("cowfood.out");
f >> K >> S >> N;
sumComb();
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++)
genComb(N, i);
V = scomb[S] - S * K - E - 1;
V %= MOD;
while (V < 0) V += MOD;
g << V;
f.close();
g.close();
return 0;
}