Cod sursa(job #1598630)

Utilizator ZenusTudor Costin Razvan Zenus Data 13 februarie 2016 02:43:43
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;

const int mod = 3210121;

int k , s , n , i , j , sc , mask;
int a[29][39] , curr[39];
long long result;
long long d[39][20009] , w[20009];

void runw()
{
    int i , j;

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

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

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

void bkt(int stp , int sc , int nb)
{
    int tmp[39];

    if (stp == n)
    {
        if (0 <= sc)
        {
            if (nb & 1) result = (result - d[k + 1][sc] + mod) % mod;
            else result = (result + d[k + 1][sc]) % mod;
        }
        return ;
    }

    for (i = 0 ; i < k ; ++i)
    tmp[i] = curr[i];

    sc = s;
    for (i = 0 ; i < k ; ++i)
    {
        curr[i] = max(curr[i] , a[stp][i]);
        sc -= curr[i];
    }

    bkt(stp + 1 , sc , nb + 1);

    sc = s;
    for (i = 0 ; i < k ; ++i)
    {
        curr[i] = tmp[i];
        sc -= curr[i];
    }

    bkt(stp + 1 , sc , nb);
}

int main()
{
freopen("cowfood.in" , "r" , stdin);
freopen("cowfood.out" , "w" , stdout);

scanf("%d%d%d" , &k , &s , &n);

for (i = 0 ; i < n ; ++i)
for (j = 0 ; j < k ; ++j)
scanf("%d" , &a[i][j]);

runw();
bkt(0 , s , 0);

if (k > 1)
result = (result - s * k - 1 + mod) % mod;

printf("%lld\n" , result);

return 0;
}