Pagini recente » Cod sursa (job #3260907) | Cod sursa (job #950107) | Cod sursa (job #580683) | Cod sursa (job #2610921) | Cod sursa (job #2845135)
#include <fstream>
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
const int MOD = 3210121,
NMAX = 21,
KMAX = 31,
SMAX = 10001;
int K, S, N, V, E;
int M[NMAX][KMAX], x[NMAX], MAX[NMAX][KMAX], SCOMB[SMAX];
void EuclidExtins(int a, int b, int &d, int &x, int &y)
{
if(b == 0)
{
x = 1;
y = 1;
d = a;
}
else
{
int x0, y0;
EuclidExtins(b, a % b, d, x0, y0);
x = y0;
y = x0 - (a / b) * y0;
}
}
int inversMod(int a)
{
int d, x, y;
EuclidExtins(a, MOD, d, x, y);
x %= MOD;
if(x < 0)x += MOD;
return x;
}
void calcSumComb()
{
for(int i = 0; i <= S; i++)
SCOMB[i] = 1;
for(int i = 1; i <= K; i++)
for(int j = 1; j <= S; j++)
{
SCOMB[j] += SCOMB[j - 1];
SCOMB[j] %= MOD;
}
}
void genSubm()
{
int k = 1, i;
x[1] = 0;
while(k > 0)
if(x[k] < N)
{
x[k]++;
int sum = 0;
for(i = 1; i <= K; i++)
{
MAX[k][i] = max(MAX[k - 1][i], M[x[k]][i]);
sum += MAX[k][i];
}
if(sum <= S)
{
if(k % 2 != 0)
{
E += SCOMB[S - sum];
E %= MOD;
}
else
{
E -= SCOMB[S - sum];
if(E < 0)E += MOD;
}
}
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];
genSubm();
V = SCOMB[S] + ( MOD - S * K - 1 );
V %= MOD;
V += MOD - E;
V %= MOD;
g << V;
return 0;
}