Cod sursa(job #2410044)

Utilizator popabogdanPopa Bogdan Ioan popabogdan Data 19 aprilie 2019 17:53:09
Problema Cowfood Scor 18
Compilator cpp-64 Status done
Runda Lista lui wefgef Marime 1.95 kb
#include <bits/stdc++.h>

#define Nmax 20
#define Smax 10000
#define Kmax 30
#define MOD 3210121

using namespace std;

ifstream fin("cowfood.in");
ofstream fout("cowfood.out");

int N, K, S;
int A[Nmax][Kmax + 5];
int V[Kmax + 5];
int ans;
int dp[Kmax + 5][Smax + 5];
int C[Kmax + 5][Kmax + 5];

int cntBits(int conf)
{
    int ret = 0;
    while(conf != 0)
    {
        ret++;
        conf &= conf - 1;
    }
    return ret;
}

int CNT(int S)
{
    if(S < 0)
        return 0;
    return dp[K][S];
}

int main()
{
    fin >> K >> S >> N;
    for(int i = 0; i < N; i++)
        for(int j = 1; j <= K; j++)
            fin >> A[i][j];
    for(int i = 1; i <= K; i++)
    {
        dp[i][0] = 1;
        for(int j = 1; j <= S; j++)
            if(i == 1)
                dp[i][j] = 1;
            else
                dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % MOD;
    }
    C[0][0] = 1;
    for(int i = 1; i <= K; i++)
    {
        C[i][0] = 1;
        for(int j = 1; j <= K; j++)
            C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % MOD;
    }
    for(int i = 1; i <= K; i++)
        for(int j = 1; j <= S; j++)
            dp[i][j] += dp[i][j - 1];
    for(int i = 2; i <= K; i++)
        if(i % 2 == 0)
            ans = (ans + 1ll * C[K][i] * CNT(S - i) % MOD) % MOD;
        else
            ans = (ans - 1ll * C[K][i] * CNT(S - i) % MOD) % MOD;
    for(int conf = 1; conf < (1 << N); conf++)
    {
        for(int j = 1; j <= K; j++)
            V[j] = 0;
        for(int bit = 0; bit < N; bit++)
            if(conf & (1 << bit))
                for(int j = 1; j <= K; j++)
                    V[j] = max(V[j], A[bit][j]);
        int newS = S;
        for(int j = 1; j <= K; j++)
            newS -= V[j];
        if(cntBits(conf) % 2 == 0)
            ans = (ans + CNT(newS)) % MOD;
        else
            ans = (ans - CNT(newS) + MOD) % MOD;
    }
    fout << ans << "\n";
    return 0;
}