Cod sursa(job #3353441)

Utilizator Lex._.Lex Guiman Lex._. Data 7 mai 2026 13:35:30
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define MOD 3210121
#define SMAX 10000
#define NMAX 20
#define KMAX 30
using namespace std;

ifstream in("cowfood.in");
ofstream out("cowfood.out");

int comb[SMAX+KMAX+1][KMAX+1];
void precalc()
{
    comb[0][0]=1;
    for(int i=1; i<=SMAX+KMAX; i++)
    {
        comb[i][0]=1;
        for(int j=1; j<=i && j<=KMAX; j++)
        {
            comb[i][j]=comb[i-1][j]+comb[i-1][j-1];
            if(comb[i][j]>=MOD) comb[i][j]-=MOD;
        }
    }
}

int C(int n, int k) ///combinari de n luate cate k
{
    if(n<k || n<0 || k<0) return 0;
    else return comb[n][k];
}

int k, s, n;
int a[NMAX][KMAX];
long long ans=0;

void bkt(int bit, int nr_biti, vector<int> maxime) //PINEX
{
    if(bit==n)
    {
        int sum=0;
        for(int i=0; i<k; i++) 
            sum+=maxime[i];

        int cnt=C(s-sum+k, k); //numarul de experimente care sunt invalidate de cele nr_biti experimente esuate alese de bkt
        if(nr_biti&1) cnt=MOD-cnt;

        //out << cnt << " -> " << sum << ": ";
        //for(auto& i : maxime) out << i << " "; out << "\n";

        ans+=cnt;
        if(ans>=MOD) ans-=MOD;
        return;
    }
    bkt(bit+1, nr_biti, maxime);
    for(int j=0; j<k; j++)
    {
        maxime[j]=max(maxime[j], a[bit][j]);
    }
    bkt(bit+1, nr_biti+1, maxime);
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    precalc();
    in >> k >> s >> n;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<k; j++)
            in >> a[i][j];
    }
    vector<int> maxime(k, 0);
    bkt(0, 0, maxime);
    //out << ans << "\n";

    ans-=1+k*s; ///eliminam cazurile in care nu sunt doua valori nenule
    if(ans<0) ans+=MOD;

    out << ans;

    return 0;
}