Cod sursa(job #2639767)

Utilizator betybety bety bety Data 3 august 2020 18:16:44
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in ("cowfood.in");

ofstream out ("cowfood.out");

const int MOD = 3210121;

bool check ( int ind );

int bkt ( int ind, int y );

int k, s, n;

int q[22][32];

int dp[32][1 << 14];

int p[32][32];

int sorin;

int nr, sum;

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

    for ( int i = 1 ; i <= n ; ++i )

        for ( int j = 1 ; j <= k ; ++j )

            in >> q[i][j];

    for ( int i = 0 ; i <= k ; ++i )
        dp[i][0] = 1;

    for ( int j = 0 ; j <= s ; ++j )

        dp[0][j] = 1;
    for ( int i = 1 ; i <= k ; ++i )
        for ( int j = 1 ; j <= s ; ++j )
            dp[i][j] = ( dp[i - 1][j] + dp[i][j - 1] ) % MOD;
    sorin = ( bkt ( 1, 0 ) - k * s - 1 ) % MOD;

    if ( sorin < 0 )

        sorin += MOD;

    out << sorin;
    return 0;
}

int bkt ( int ind, int y )
{
    if ( ind == n + 1 )
    {
        nr = 0;
        sum = s;
        for ( int i = 1 ; i <= k ; ++i )
            sum -= p[ind][i];

        for ( int i = 1 ; i <= n ; ++i )

            if ( y & ( 1 << i ) )
                ++nr;

        if ( sum < 0 )

            return 0;
        if ( nr & 1 )
            return dp[k][sum] * -1;

        return dp[k][sum];
    }
    for ( int i = 1 ; i <= k ; ++i )
        p[ind + 1][i] = p[ind][i];
    int sol;
    sol = bkt ( ind + 1, y );

    for ( int i = 1 ; i <= k ; ++i )
        p[ind + 1][i] = max ( p[ind][i], q[ind][i] );

    return ( sol + bkt ( ind + 1, y | ( 1 << ind ) ) ) % MOD;
}
/// cowfooooouuuuuoooood