Cod sursa(job #573866)

Utilizator DraStiKDragos Oprica DraStiK Data 6 aprilie 2011 17:05:39
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <algorithm>
using namespace std;

#define MOD 3210121
#define MAX 10005
#define DIM 35

int v[DIM][DIM],s[DIM][MAX];
int cnt[MAX],sol[DIM];
int K,S,N,nrt;

void read ()
{
    int i,j;

    scanf ("%d%d%d",&K,&S,&N);
    for (i=1; i<=N; ++i)
        for (j=1; j<=K; ++j)
            scanf ("%d",&v[i][j]);
}

void back (int pas,int semn,int cur[DIM])
{
    int aux[DIM];
    int i,sum;

    if (pas==N+1)
    {
        sum=S;
        for (i=1; i<=K; ++i)
            sum-=cur[i];

        if (sum>=0)
            if (!semn)
                nrt=(nrt+cnt[sum])%MOD;
            else
                nrt=(nrt-cnt[sum]+MOD)%MOD;
    }
    else
    {
        for (i=1; i<=K; ++i)
            aux[i]=cur[i];
        back (pas+1,semn,aux);

        for (i=1; i<=K; ++i)
            cur[i]=max (cur[i],v[pas][i]);
        back (pas+1,semn^1,cur);
    }
}

void solve ()
{
    int i,j;

    s[0][0]=1;
    for (i=1; i<=K; ++i)
        for (j=0; j<=S; ++j)
            if (!j)
                s[i][j]=s[i-1][j];
            else
                s[i][j]=(s[i-1][j]+s[i][j-1])%MOD;

    cnt[0]=s[K][0];
    for (i=1; i<=S; ++i)
        cnt[i]=(cnt[i-1]+s[K][i])%MOD;

    back (1,0,sol);

    nrt-=K*S+1;
    if (nrt<0)
        nrt=MOD+nrt%MOD;

    printf ("%d",nrt);
}

int main ()
{
    freopen ("cowfood.in","r",stdin);
    freopen ("cowfood.out","w",stdout);

    read ();
    solve ();

    return 0;
}