Cod sursa(job #2338885)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 7 februarie 2019 21:50:09
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <bits/stdc++.h>
#define MOD 3210121

int n, k, s, sol, V[32], A[32], dp[32][1 << 14], v[22][32] ;

void Back(int x, int bit)
{
    int i  ;
    if (x == n + 1)
    {
        int S(0) ;
        for (i = 1 ; i <= k ; ++ i)
            S += V[i] ;
        if(S <= s)
        {
            int M = dp[k][s - S] ;
            if(bit & 1)
                M = -M ;
            sol = (sol + M + MOD) % MOD ;
        }
    }
    else
    {
        Back(x + 1, bit) ;
        int A[k + 1] ;
        for (i = 1 ; i <= k ; ++ i)
            A[i] = V[i], V[i] = std::max(V[i], v[x][i]) ;
        Back(x + 1, bit + 1) ;
        for (i = 1 ; i <= k ; ++ i)
            V[i] = A[i] ;
    }
}

int main()
{
    freopen("cowfood.in", "r", stdin)  ;
    freopen("cowfood.out", "w", stdout)  ;
    int i, j  ;
    scanf("%d %d %d", &k, &s, &n)  ;
    for (i = 1 ; i <= n ; ++ i)
        for (j = 1 ; j <= k ; ++ j)
            scanf("%d", &v[i][j])  ;
    for (i = 0 ; i <= s ; ++ i)
        dp[0][i] = 1;
    for (i = 1 ; i <= k ; ++ i)
        for (j = dp[i][0] = 1 ; j <= s ; ++ j)
            dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % MOD ;
    Back(1, 0) ;
    printf("%d", (sol - 1 - s * k + MOD) % MOD) ;
}