Cod sursa(job #2865458)

Utilizator popoviciAna16Popovici Ana popoviciAna16 Data 8 martie 2022 20:32:18
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>
#include <iostream>
using namespace std;

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

const int r = 3210121;

int invexp (int x)
{
    int e = r-2, rez = 1;
    while (e)
    {
        if (e & 1)
            rez = 1ll * rez * x % r;
        x = 1ll * x * x % r;
        e = e >> 1;
    }
    return rez;
}

int f[10501], invf[10501];

int comb (int n, int k)
{
    return 1ll * f[n] * invf[n-k] % r * invf[k] % r;
}

int scomb[10501];

void precalc (int n, int k)
{
    int i;
    f[0] = invf[0] = 1;
    for (i = 1; i<=n+k; i++)
    {
        f[i] = 1ll * f[i-1] * i % r;
        invf[i] = invexp (f[i]);
    }

    scomb[0] = 1;
    for (i = 1; i<=n; i++)
        scomb[i] = (scomb[i-1] + comb(i+k-1, k-1)) % r;
}

int a[21][31];
int v[21][31];
int S, n, k, nrb, rasp;

void bkt (int it) //it = 1 ... n
{
    if (it == n+1)
    {
        int i, s = 0, nr = 0;
        for (i = 1; i<=k; i++)
        {
            s = s + v[n][i];
            if (v[n][i] != 0)
                nr++;
        }

        if (s <= S && nr >= 2)
        {
            if (nrb & 1)
                rasp = (rasp - scomb[S-s] + r) % r;
            else
                rasp = (rasp + scomb[S-s]) % r;
        }
    }
    else
    {
        int i;

        for (i = 1; i<=k; i++)
            v[it][i] = max (v[it-1][i], a[it][i]);
        nrb++;
        bkt (it+1);
        nrb--;

        for (i = 1; i<=k; i++)
            v[it][i] = v[it-1][i];
        bkt (it+1);
    }
}

int main()
{
    int i, j;

    fin >> k >> S >> n;
    for (i = 1; i<=n; i++)
        for (j = 1; j<=k; j++)
            fin >> a[i][j];

    precalc (S, k);

    rasp = (scomb[S] - 1 + r - k*S) % r;

    bkt (1);
    fout << rasp;
    return 0;
}