Cod sursa(job #2331150)

Utilizator Mihai_PredaPreda Mihai Dragos Mihai_Preda Data 29 ianuarie 2019 11:18:22
Problema Cowfood Scor 86
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

const int MOD = 3210121;
const int combMax = 11000;
const int nMax = 21;
const int kMax = 31;

long long fact[combMax], invFact[combMax];

int power(int base, int exp)
{
    if(exp == 0)
        return 1;
    if(exp % 2 == 0)
    {
        int x = power(base, exp / 2);
        return (1LL * x * x) % MOD;
    }
    return (1LL * base * power(base, exp - 1)) % MOD;
}

inline int invers(int x)
{
    return power(x, MOD-2);
}

int comb(int n, int k)
{
    return (((fact[n] * invFact[k]) % MOD) * invFact[n-k]) % MOD;
}

int k, s, n;
int rasp = 0;
int a[nMax][kMax], mx[kMax];

void backtr(int pos, int last)
{
    if(pos > 1)
    {
        int sign = 1;
        if(pos % 2)
            sign = -1;
        int sum = 0;
        for(int j = 1; j <= k; ++j)
            sum = sum + mx[j];
        if(sum <= s)
        {
            rasp += sign * comb(s - sum + k, k);
            if(rasp < 0)
                rasp += MOD;
            rasp %= MOD;
        }
    }
    if(pos <= n)
    {
        int t[k+1];
        for(int i = last + 1; i <= n; ++i)
        {
            for(int j = 1; j <= k; ++j)
            {
                t[j] = mx[j];
                if(a[i][j] > mx[j])
                    mx[j] = a[i][j];
            }
            backtr(pos+1, i);
            for(int j = 1; j <= k; ++j)
                mx[j] = t[j];
        }
    }
}

int main()
{
    fact[0] = 1;
    for(int i = 1; i < combMax; ++i)
    {
        fact[i] = (fact[i-1] * i) %  MOD;
        invFact[i] = invers(fact[i]);
    }
    ifstream in("cowfood.in");
    in >> k >> s >> n;
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= k; ++j)
            in >> a[i][j];
    in.close();
    backtr(1, 0);

    rasp = comb(s+k, k) - rasp - 1 - s * k;
    if(rasp < 0)
        rasp += MOD;
    rasp %= MOD;
    ofstream out("cowfood.out");
    out << rasp;
    out.close();
    return 0;
}