Cod sursa(job #3368370)

Utilizator ridicheTudor Diaconu ridiche Data 14 octombrie 2026 12:34:50
Problema Cowfood Scor 6
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>
#include <climits>

using namespace std;

const int MOD = 3210121;

ifstream in;
ofstream ou;

short k, s, n, experiment[25][35], pascal[35][35];

int starsandbars(int bars, int stars)
{
    return pascal[stars + bars][bars];
}

int main()
{
    pascal[1][1] = 1;
    for (int i = 2; i < 35; i++)
    {
        pascal[i][1] = pascal[i][i] = 1;
        for (int j = 2; j < i; j++)
        {
            pascal[i][j] = pascal[i-1][j] + pascal[i-1][j-1];
            pascal[i][j] %= MOD;
        }
    }
    in.open("cowfood.in");
    ou.open("cowfood.out");
    in >> k >> s >> n;
    for (short i = 0; i < n; i++)
    {
        for (short j = 0; j < k; j++)
        {
            in >> experiment[i][j];
        }
    }
    int r = 0;
    for (int bitmask = 0; bitmask < (1 << n); bitmask++)
    {
        int sumaleft = s; bool aditie = 1;
        for (int cur = 0; cur < n; cur++)
        {
            if ((bitmask >> cur) & 1)
                aditie = !aditie;
        }
        
        for (int mancare = 0; mancare < k; mancare++)
        {
            int chestie = 0;
            for (int cur = 0; cur < n; cur++)
            {
                if ((bitmask >> cur) & 1)
                    chestie = max(chestie, experiment[cur][mancare]-1);
            }
            sumaleft -= chestie;
        }
        if (sumaleft < 0)
            continue;
        
        // ou << bitmask << ": " << sumaleft << " " << k << " " << (aditie?"+":"-") << starsandbars(sumaleft, k) << "\n";
        
        if (aditie)
        {
            r += starsandbars(sumaleft, k);
            r %= MOD;
        }
        else
        {
            r -= starsandbars(sumaleft, k);
            r += MOD;
            r %= MOD;
        }
    }
    ou << r << "\n";
    return 0;
}