Cod sursa(job #1847633)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 14 ianuarie 2017 20:20:11
Problema Cowfood Scor 18
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <cstdio>
#include <algorithm>
#define BIT(x) (1<<(x))
#define MOD 3210121

using namespace std;
typedef long long llong;

int mat[21][31];
int c[31][10001];

int main()
{
    freopen("cowfood.in", "r", stdin);
    freopen("cowfood.out", "w", stdout);
    llong rc, rez = 0;
    int s, n, k, i, j, p, v[31], nb, sc;
    scanf("%d%d%d", &k, &s, &n);
    s -= k;
    for(i = 0; i <= k + 1; i++)
        c[i][0] = 1;
    for(i = 0; i <= s + 1; i++)
        c[0][i] = 1;
    for(i = 1; i <= k + 1; i++)
    {
        for(j = 1; j <= s + 1; j++)
        {
            c[i][j] = (c[i - 1][j] + c[i][j - 1]) % MOD;
        }
    }
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < k; j++)
        {
            scanf("%d", &mat[i][j]);
            mat[i][j]--;
        }
    }
    for(i = 1; i < BIT(n); i++)
    {
        nb = 0;
        sc = 0;
        for(p = 0; p < k; p++)
            v[p] = 0;
        for(j = 0; j < n; j++)
        {
            if(i & BIT(j))
            {
                nb++;
                for(p = 0; p < k; p++)
                {
                    v[p] = max(v[p], mat[j][p]);
                }
            }
        }
        for(p = 0; p < k; p++)
        {
            sc += v[p];
        }
        if(s - sc > 0)
            rc = c[k][s - sc];
        else rc = 0;
        if(nb & 1) rez = (rez + rc) % MOD;
        else
        {
            if(rez - rc < 0) rez += MOD;
            rez = (rez - rc) % MOD;
        }
    }
    rez = c[k][s] - rez;
    if(rez < 0) rez += MOD;
    printf("%lld", rez % MOD);
    return 0;
}