Cod sursa(job #1105683)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 11 februarie 2014 23:27:57
Problema Cowfood Scor 0
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.45 kb
#include <fstream>
#define NM 35
#define SM 10010

using namespace std;

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

const int MOD=3210121;
int N, K, S;
int A[NM][NM], B[NM];
int DP[NM][SM];
int ANS;

int main ()
{
    f >> K >> S >> N;
    for (int i=1; i<=N; i++)
        for (int j=1; j<=K; j++)
            f >> A[i][j];

    DP[0][0]=1;
    for (int j=0; j<=S; j++)
        DP[1][j]=DP[1][j-1]+1;

    for (int i=2; i<=K; i++)
    {
        DP[i][0]=1;
        for (int j=1; j<=S; j++)
        {
            DP[i][j]=DP[i-1][j] + DP[i][j-1];
            if (DP[i][j]>=MOD)
                DP[i][j]-=MOD;
        }
    }

    for (int conf=0; conf<(1 << N); conf++)
    {
        int cnt=0;
        int i, j;

        for (j=1; j<=K; j++)
            B[j]=0;

        for (i=0; i<N; i++)
            if (((1 << i)&conf))
            {
                cnt++;
                for (j=1; j<=K; j++)
                    B[j]=max(B[j], A[i+1][j]);
            }

        int NS=S;
        for (j=1; j<=K; j++)
            NS-=B[j];

        if (NS<0)
            continue;

        if (cnt%2)
        {
            ANS=ANS+MOD-DP[K][NS];
            if (ANS>=MOD)
                ANS-=MOD;
        }
        else
        {
            ANS=ANS+DP[K][NS];
            if (ANS>=MOD)
                ANS-=MOD;
        }
    }

    g << ANS << '\n';

    f.close();
    g.close();

    return 0;
}