Cod sursa(job #1910438)

Utilizator Athena99Anghel Anca Athena99 Data 7 martie 2017 16:57:07
Problema Cowfood Scor 28
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>

using namespace std;

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

typedef long long i64;

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

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

i64 ans;

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];
        }

        ans= ((ans+max(0, s[aux])*sg)%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);

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

    return 0;
}