Cod sursa(job #1845467)

Utilizator TataruTataru Mihai Tataru Data 11 ianuarie 2017 15:40:00
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#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";
}