Cod sursa(job #2239358)

Utilizator LucaSeriSeritan Luca LucaSeri Data 10 septembrie 2018 17:18:00
Problema Cowfood Scor 54
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <fstream>
using namespace std;

typedef pair< int, int > pii;
typedef pair< long long, long long > pll;
typedef long long ll;
typedef vector< int > vi;
typedef vector< ll > vll;
typedef vector< pii > vpii;
typedef long double ld;

ll lgput(ll a, ll b, ll mod) {
    ll ret = 1;
    while( b ){
        if(b & 1) ret = (ret * a) % mod;
        a = (a * a) % mod;
        b >>= 1;
    }

    return ret;
}

int binarySearch(vector< int > &v, int value) {
    int best = 0;
    for(int step = 29; step >= 0; --step) {
        if(best + (1<<step) < v.size() && v[best + (1<<step)] <= value) best += (1<<step);
    }

    return best;
}

const int MOD = 3210121;

const int MAXS = 1e4 + 50;
const int MAXN = 25;
const int MAXK = 35;

int comb[MAXS];
int k, s, n;
int recipes[MAXN][MAXK];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    ifstream f("cowfood.in");
    f >> k >> s >> n;

    for(int i = 0; i < n; ++i) {
        for(int j = 0; j < k; ++j) {
            f >> recipes[i][j];
        }
    }

    for(int i = 0; i < MAXS; ++i) comb[i] = 1;
    for(int i = 0; i < k; ++i) {
        for(int j = 0; j < MAXS; ++j) {
            comb[j] = (comb[j] + comb[j-1]) % MOD;
        }
    }



    int ans = comb[s];
    for(int mask = 1; mask < (1<<n); ++mask) {
        int sum = 0;
        for(int i = 0; i < k; ++i) {
            int maxx = -1;
            for(int j = 0; j < n; ++j) {
                if(mask&(1<<j)) {
                    maxx = max(maxx, recipes[j][i]);
                }
            }

            sum += maxx;
        }

        if(sum > s) continue;
        if(__builtin_popcount(mask)&1) ans = (ans + MOD - comb[s - sum]) % MOD;
        else ans = (ans + comb[s-sum]) % MOD;
    }

    ofstream g("cowfood.out");
    ///Scadem pe cele care nu au macar 2 nenule
    g << (ans + (MOD - s*k - 1) + MOD) % MOD;
    return 0;
}