Cod sursa(job #2450357)

Utilizator moise_alexandruMoise Alexandru moise_alexandru Data 22 august 2019 20:54:29
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#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;
}