Pagini recente » Cod sursa (job #1432767) | Cod sursa (job #2584436) | Cod sursa (job #254442) | Cod sursa (job #1744022) | Cod sursa (job #1845467)
#include<fstream>
using namespace std;
const char inFile[] = "cowfood.in";
const char outFile[] = "cowfood.out";
const int maxn = 50;
const int maxs = 10005;
const int mod = 3210121;
ifstream fin(inFile);
ofstream fout(outFile);
int k, s, n, i, j, S, pos[maxn][maxs], a[maxn][maxn], rez, sgn, maxt[maxn], p, elem[maxn][maxn];
void back(int level, int sgn, int path)
{
for(int i = level; i <= n; ++i)
{
int S = s;
for(int j = 1; j <= k; ++j)
elem[path][j] = max(elem[path - 1][j], a[i][j]), S -= elem[path][j];
if(S >= 0)
rez = (rez + sgn * pos[k][S]) % mod;
back(i + 1, -sgn, path + 1);
}
}
int main()
{
fin >> k >> s >> n;
pos[0][0] = 1;
pos[1][0] = 1;
for(i = 1; i <= k; ++i, pos[i][0] = 1)
for(j = 1; j <= s; ++j)
pos[i][j] = (pos[i - 1][j] + pos[i][j - 1]) % mod;
for(i = 1; i <= n; ++i)
for(j = 1; j <= k; ++j)
fin >> a[i][j];
for(i = 2; i <= s; ++i)
rez = (rez + pos[k][i] - k) % mod;
for(i = 1; i <= s; ++i)
pos[k][i] = (pos[k][i] + pos[k][i - 1]) % mod;
back(1, -1, 1);
if(rez < 0)
rez += mod;
fout << rez << "\n";
}