Cod sursa(job #1494355)

Utilizator akaprosAna Kapros akapros Data 30 septembrie 2015 22:33:01
Problema Cowfood Scor 12
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxN 25
#define maxS 10005
#define maxK 35
#define mod 3210121
#define maxP 1048580
using namespace std;
int n, s, k, i, j, dp[maxS][maxK];
int a[maxN][maxK], b[maxK], sol, lpow2[maxP];
void read()
{
    freopen("cowfood.in", "r", stdin);
    scanf("%d %d %d", &n, &s, &k);
    for (i = 0; i < n; ++ i)
        for (j = 1; j <= k; ++ j)
            scanf("%d", &a[i][j]);
}
void DP()
{
    int p2 = 1;
    lpow2[p2] = 0;
    for (i = 1; i <= n; ++ i)
    {
        p2 *= 2;
        lpow2[p2] = i;
    }
    for (i = 0; i <= k + 1; ++ i)
        dp[0][i] = 1;
    for (j = 1; j <= s; ++ j)
    {
        for (i = 1; i <= k + 1; ++ i)
        {
            dp[j][i] = dp[j][i - 1] + dp[j - 1][i];
            if (dp[j][i] > mod)
                dp[j][i] -= mod;
        }
    }
    sol = dp[s][k + 1] - 1 - k * s;
    if (sol < 0)
        sol += mod;
}
void solve()
{
    int p2 = 1 << n, m, p, sum, nb1;
    bool ok;
    DP();
    for (i = 1; i < p2; ++ i)
    {
        m = i;
        sum = 0;
        ok = 1;
        nb1 = 0;
        memset(b, 0, sizeof(b));
        do
        {
            p = lpow2[m ^ (m & (m - 1))];
            ++ nb1;
            for (j = 1; j <= k; ++ j)
            {
                if (b[j] < a[p][j])
                {
                    sum -= b[j];
                    b[j] = a[p][j];
                    sum += b[j];
                }
                if (sum > s)
                {
                    ok = 0;
                    break;
                }
            }
        }
        while (m &= m - 1);
        if (!ok)
            break;
        if (nb1 % 2)
            sol -= dp[s - sum][k + 1];
        else
            sol += dp[s - sum][k + 1];
        if (sol > mod)
            sol -= mod;
        if (sol < 0)
            sol += mod;
    }
}
void write()
{
    freopen("cowfood.out", "w", stdout);
    printf("%d", sol);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}