Cod sursa(job #1200660)

Utilizator misinoonisim necula misino Data 23 iunie 2014 12:17:29
Problema Cowfood Scor 32
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<fstream>

#define MOD 3210121
#define N 30
#define K 40
#define S 10010

using namespace std;

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

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

inline void back(int kk , int semn){
    if(kk >= 2)
    {
        int sum = s;
        for(int i = 1 ; i <= k ; ++ i)
            sum -= maxi[i][kk - 1];

        if(sum < 0)
            return;

        inv += semn * d[sum][k];

        if(inv < 0)
            inv += MOD;

        if(inv >= MOD)
            inv -= MOD;
    }

    if(k > n)
        return ;

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

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

        back(kk + 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 = 0 ; i <= k ; ++ i)
        d[0][i] = 1;

    for(i = 1 ; i <= s ; ++ i)
        d[i][0] = 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] - s * k - inv - 1;

    g << sol << '\n';

    return 0;
}