Pagini recente » Cod sursa (job #2347030) | Cod sursa (job #1927061) | Cod sursa (job #2064886) | Cod sursa (job #2940305) | Cod sursa (job #2450357)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("cowfood.in");
ofstream out("cowfood.out");
#define int long long
const int maxdim = 10050;
const int mod = 3210121;
const int maxn = 35;
int comb[maxdim][maxn];
int mxpart[maxn][maxn];
int M[maxn][maxn];
int sp[maxdim];
int v[maxn];
int nr = 0;
int n, k, S;
void _back_(int poz)
{
if(poz == n + 1)
return;
if(poz >= 1)
{
for(int i = 1; i <= k; i++)
mxpart[poz][i] = max(mxpart[poz - 1][i], M[v[poz]][i]);
int sum = 0;
for(int i = 1; i <= k; i++)
sum = sum + mxpart[poz][i];
if(sum <= S)
{
int semn = 0;
if(poz % 2 == 1)
semn = -1;
else
semn = 1;
nr = (nr + semn * sp[S - sum] + mod) % mod;
}
}
for(int i = v[poz] + 1; i <= n; i++)
{
v[poz + 1] = i;
_back_(poz + 1);
//v[poz] = 0;
}
}
int32_t main()
{
in >> k >> S >> n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= k; j++)
in >> M[i][j];
for(int i = 0; i <= S + k - 1; i++)
comb[i][0] = 1;
for(int i = 1; i <= S + k - 1; i++)
{
if(i <= k)
comb[i][i] = 1;
for(int j = 1; j < k && j < i; j++)
comb[i][j] = (comb[i - 1][j - 1] + comb[i - 1][j]) % mod;
}
/*
for(int i = 0; i <= S + k - 1; i++, cerr << "\n")
for(int j = 0; j <= i; j++)
cerr << comb[i][j] << " ";
*/
sp[0] = 1;
for(int i = 1; i <= S; i++)
sp[i] = (sp[i - 1] + comb[k + i - 1][k - 1]) % mod;
_back_(0);
out << (nr + sp[S] - k * S - 1 + mod * 50) % mod << "\n";
return 0;
}