Cod sursa(job #3220252)

Utilizator Radu_MocanasuMocanasu Radu Radu_Mocanasu Data 2 aprilie 2024 22:32:32
Problema Cowfood Scor 12
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <bits/stdc++.h>
#define mod 3210121
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
int f[10055];
int inv[10055];
int a[22][32];
int c[10005][32];
int v[31];
int rez,n,s,k;
void euclid(int a, int b, int &x, int &y){
    if(!b){
        x = 1;
        y = 0;
        return;
    }
    int x0,y0;
    euclid(b, a % b, x0, y0);
    x = y0;
    y = x0 - (a / b) * y0;
}
int invmod(int n){
    int x,y;
    euclid(n,mod,x,y);
    return (x % mod + mod) % mod;
}
int comb(int n, int k){
    if(k > n) return 0;
    return (1LL * f[n] * inv[k] % mod * inv[n - k]) % mod;
}
int stars_and_bars2(int n, int k){
    return comb(n + k - 1, k - 1);
}
void genf(){
    f[0] = inv[0] = 1;
    for(int i = 1; i <= 10050; i++){
        f[i] = (1LL * f[i - 1] * i) % mod;
        inv[i] = invmod(f[i]);
    }
}
void precalc(){
    for(int i = 0; i <= s; i++) c[i][0] = 1;
    for(int i = 0; i <= k; i++) c[0][i] = 1;
    for(int i = 1; i <= s; i++){
        for(int j = 1; j <= k; j++) c[i][j] = (c[i - 1][j] + stars_and_bars2(i,j)) % mod;
    }
}
void solve(int e){
    memset(v, 0, sizeof v);
    int t = 0, nrb = 0;
    for(int i = 0; i < n; i++){
        if((1 << i) & e){
            nrb++;
            for(int j = 1; j <= k; j++) v[j] = max(v[j], a[i][j]);
        }
    }
    for(int j = 1; j <= k; j++) t += v[j];
    if(t > s) return;
    if(nrb & 1) rez -= c[s - t][k];
    else rez += c[s - t][k];
}

int main()
{
    int i,j;
    fin >> n >> s >> k;
    genf();
    precalc();
    for(i = 0; i < n; i++){
        for(j = 1; j <= k; j++) fin >> a[i][j];
    }
    rez = ((c[s][k] - s * k - 1) % mod + mod) % mod;
    for(int e = 1; e < (1 << n); e++) solve(e);
    fout << rez;
    return 0;
}