Cod sursa(job #2330573)

Utilizator Mihai_PredaPreda Mihai Dragos Mihai_Preda Data 28 ianuarie 2019 16:56:24
Problema Cowfood Scor 24
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

const int MOD = 3210121;
const int combMax = 11000;

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] * invFact[n-k]) % MOD;
}

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");
    int k, s, n;
    in >> k >> s >> n;
    vector<vector<int> > a(n, vector<int>(k));
    for(int i = 0; i < n; ++i)
        for(int j = 0; j < k; ++j)
            in >> a[i][j];
    in.close();
    vector<int> mx(k);
    int rasp = 0;
    for(int i = 1; i < (1 << n); ++i)
    {
        int nr = 0;
        fill(mx.begin(), mx.end(), 0);
        for(int j = 0; j < n; ++j)
            if((i & (1 << j)) != 0)
            {
                nr++;
                //folosim experimentul j
                for(int t = 0; t < k; ++t)
                    if(a[j][t] > mx[t])
                        mx[t] = a[j][t];
            }
        int sign = 1;
        if(nr % 2 == 0)
            sign = -1;
        int sum = 0;
        for(int j = 0; j < k; ++j)
            sum = sum + mx[j];
        if(sum <= s)
        {
            rasp += sign * comb(s - sum + k, k);
            if(rasp < 0)
                rasp += MOD;
            rasp %= MOD;
        }
    }

    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;
}