Cod sursa(job #1911000)

Utilizator Athena99Anghel Anca Athena99 Data 7 martie 2017 19:05:41
Problema Cowfood Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <fstream>

using namespace std;

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

const int kmax= 30;
const int nmax= 20;
const int smax= 10000;
const int mod= 3210121;

int n, k, sum, ans;
int d[smax+1][kmax+1], v[nmax+1][kmax+1], ms[nmax+1][kmax+1], s[smax+1];

void back( int x, int sg ) {
    if ( x==n+1 ) {
        int aux= sum;
        for ( int i= 1; i<=k; ++i ) {
            aux= aux-ms[x-1][i];
        }

        if ( aux>=0 ) {
            ans= ((ans+s[aux]*sg+mod)%mod+mod)%mod;
        }
    } else {
        for ( int i= 1; i<=k; ++i ) {
            ms[x][i]= ms[x-1][i];
        }
        back(x+1, sg);

        for ( int i= 1; i<=k; ++i ) {
            ms[x][i]= max(ms[x-1][i], v[x][i]);
        }
        back(x+1, -sg);
    }
}

int main() {
    fin>>k>>sum>>n;
    for ( int i= 1; i<=n; ++i ) {
        for ( int j= 1; j<=k; ++j ) {
            fin>>v[i][j];
        }
    }

    for ( int i= 0; i<=smax; ++i ) {
        d[i][0]= 1;
        for ( int j= 1; j<=i && j<=kmax; ++j ) {
            d[i][j]= (d[i-1][j-1]+d[i-1][j])%mod;
        }
    }
    s[0]= 1;
    for ( int i= 1; i<=sum; ++i ) {
        s[i]= (d[i+k-1][k-1]+s[i-1])%mod;
    }

    back(1, 1);
    fout<<((ans-sum*k-1)%mod+mod)%mod<<"\n";

    return 0;
}