Cod sursa(job #603461)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 16 iulie 2011 13:58:09
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define maxn 33
#define maxs 10010
#define mod 3210121

int n, i, j, s, k, sol;
int d[maxs], e[maxn][maxn], me[maxn][maxn];

void back(int niv, int semn)
{
    if(niv==n+1)
    {
        int sum=0;
        for(int i=1; i<=k; ++i)
            sum+=me[niv-1][i];

        if(s>=sum)
            sol=(sol+2*mod+semn*d[s-sum])%mod;

        return;
    }

    for(int i=1; i<=k; ++i)
        me[niv][i]=me[niv-1][i];

    back(niv+1, semn);

    for(int i=1; i<=k; ++i)
        me[niv][i]=max(me[niv-1][i], e[niv][i]);

    back(niv+1, semn*(-1));
}

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

    scanf("%d%d%d", &k, &s, &n);
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=k; ++j)
            scanf("%d", &e[i][j]);

    for(int i=0; i<=s; ++i)
        d[i]=1;
    for(int i=1; i<=k; ++i)
        for(int j=1; j<=s; ++j)
            d[j]=(d[j]+d[j-1])%mod;

    back(1, 1);

    sol=(sol-1-(k*s)%mod+2*mod)%mod;

    printf("%d\n", sol);

    return 0;
}