Cod sursa(job #2416703)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 27 aprilie 2019 22:14:00
Problema Cowfood Scor 58
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <fstream>

using namespace std;

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

const int DIM=35;
const int VAL=10005;
const int MOD=3210121;

int K, S, N, i, j, ind;
int v[DIM][DIM], last;
int SUM[VAL], conf, nr0;
int SOL, A, X, ANS[DIM];
int COMB[VAL+DIM][DIM];

int main()
{
    fin >> K >> S >> N;
    for (i=0; i<N; i++)
    {
        nr0=0;
        for (j=1; j<=K; j++)
        {
            fin >> v[i][j];
            if (v[i][j]==0)
                nr0++;
        }
        if (nr0==K)
        {
            fout << 0 << '\n';
            fin.close();
            fout.close();
            return 0;
        }
    }
    COMB[1][0]=COMB[1][1]=1;
    for (i=2; i<=S+K; i++)
    {
        COMB[i][0]=1;
        for (j=1; j<=min(i, K-1); j++)
        {
            COMB[i][j]=COMB[i-1][j-1]+COMB[i-1][j];
            if (COMB[i][j]>=MOD)
                COMB[i][j]-=MOD;
        }
    }
    for (i=1; i<=S; i++)
    {
        SUM[i]=SUM[i-1]+COMB[i+K-1][K-1];
        if (SUM[i]>=MOD)
            SUM[i]-=MOD;
    }
    for (conf=1; conf<(1 << N); conf++)
    {
        ind=0;
        for (i=0; i<N; i++)
        {
            if ((conf & (1 << i))!=0)
            {
                ind++;
                for (j=1; j<=K; j++)
                    ANS[j]=max(ANS[j], v[i][j]);
            }
        }
        A=0;
        nr0=0;
        for (j=1; j<=K; j++)
        {
            if (ANS[j]==0)
                nr0++;
            A+=ANS[j];
            ANS[j]=0;
        }
        if (A>S)
            continue;
        X=SUM[S-A];
        if (nr0>K-2)
            X-=S-A;
        else
            X++;
        if (ind % 2==1)
            SOL+=X;
        else
            SOL-=X;
        SOL%=MOD;
        if (SOL<0)
            SOL+=MOD;
    }
    SOL=SUM[S]-SOL-K*S;
    SOL%=MOD;
    if (SOL<0)
        SOL+=MOD;
    fout << SOL << '\n';
    fin.close();
    fout.close();
    return 0;
}