Cod sursa(job #1201568)

Utilizator misinoonisim necula misino Data 25 iunie 2014 14:26:34
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<fstream>

#define S 10020
#define N 22
#define K 33
#define MOD 3210121

using namespace std;

ifstream f("cowfood.in");
ofstream g("cowfood.out");

int k,s,n,i,j,sol,a[N][K],d[S][K],maxi[N][K],v[N],inv;

inline void back(int p , int semn){
    if(p > 1)
    {
        int i,suma = s;

        for(i = 1 ; i <= k ; ++ i)
            suma -= maxi[p - 1][i];

        if(suma < 0)
            return ;

        inv = (inv + MOD + semn * d[suma][k]) % MOD;
    }

    if(p > n)
        return;

    for(int i = v[p - 1] + 1; i <= n ; ++ i)
    {
        v[p] = i;

        for(int j = 1 ; j <= k ; ++ j)
            maxi[p][j] = max(maxi[p - 1][j] , a[i][j]);

        back(p + 1 , -semn);
    }
}

int main()
{
    f >> k >> s >> n;

    for(i = 1 ; i <= n ; ++ i)
        for(j = 1 ; j <= k ; ++ j)
        f >> a[i][j];

    for(i = 1 ; i <= s ; ++ i)
        d[i][0] = 1;
    for(i = 1 ; i <= k ; ++ i)
        d[0][i] = 1;

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

    back(1 , -1);

    sol = d[s][k] - inv + MOD - s * k - 1;

    while(sol < 0) sol += MOD;
    while(sol >= MOD) sol -= MOD;

    g << sol << '\n';

    return 0;
}