Cod sursa(job #1213840)

Utilizator atatomirTatomir Alex atatomir Data 29 iulie 2014 00:39:15
Problema Cowfood Scor 14
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <iostream>
#include <cstdio>

#define mod 3210121

using namespace std;

long c[10100][30];
long n,k,s,a[30][40],i,j,rez,v[35];

inline void initializate() {
    long n = 10050,m=25,i,j;
    for(i=1;i<=n;i++) c[i][1] = i;
    for(i=2;i<=n;i++)
        for(j=2;j<=min(m,i);j++)
            c[i][j] = (c[i-1][j-1]+c[i-1][j])% mod;

    for(j=1;j<=m;j++){
        for(i=j+1;i<=n;i++) c[i][j] = (c[i][j] + c[i-1][j]) % mod;
    }
}

void Back(long pas,long sel,long vs[35]){
    long sl,i,v[35];
    for(i=1;i<=k;i++) v[i] = vs[i];

    if(pas > n){
        sl = s;
        for(i=1;i<=k;i++) sl -= v[i];
        if(sl < 0) return;


        /*for(i=1;i<=k;i++) printf("%ld ",v[i]);
        printf("\n%ld\n\n",sl);*/

        if(sel % 2 == 0)
            rez += c[sl+k-1][k-1];
        else{
            rez -= c[sl+k-1][k-1];
            while (rez < 0) rez+= mod;
        }

        rez %= mod;
    } else {
        Back(pas+1,sel,v);

        for(i=1;i<=k;i++){
            if(v[i] < a[i][pas]){
                v[i] = a[i][pas];
            }
        }
        Back(pas+1,sel+1,v);
    }
}

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

    initializate();

    scanf("%ld %ld %ld\n",&k,&s,&n);
    // k e nr de ierburi, n e nr de amestecuri
    for(i=1;i<=n;i++){
        for(j=1;j<=k;j++) scanf("%ld",&a[i][j]);
    }

    rez = 0;
    for(i=1;i<=k;i++) v[i] = 1;
    Back(1,0,v);

    printf("%ld",rez);

    return 0;
}