Cod sursa(job #3220260)

Utilizator Radu_MocanasuMocanasu Radu Radu_Mocanasu Data 2 aprilie 2024 22:53:03
Problema Cowfood Scor 12
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 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 sb2[10005][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 <= k + 1; i++) sb2[0][i] = c[0][i] = 1;
    for(int i = 1; i <= s; i++){
        for(int j = 1; j <= k + 1; j++){
            sb2[i][j] = (sb2[i - 1][j] + sb2[i][j - 1]) % mod;
            c[i][j - 1] = sb2[i][j];
        }
    }
}
int last[32][32];
int st[32];
void backt(int e, int t){
    if(e == n + 1){
        if(!t) return;
        int stemp = 0;
        for(int i = 1; i <= k; i++) stemp += last[t][i];
        if(s >= stemp){
            if(t & 1) rez -= c[s - stemp][k];
            else rez += c[s - stemp][k];
        }
        return;
    }
    backt(e + 1, t);
    st[e] = 1;
    for(int i = 1; i <= k; i++) last[t + 1][i] = max(last[t][i], a[e][i]);
    backt(e + 1, t + 1);
    st[e] = 0;
}
int main()
{
    int i,j;
    fin >> n >> s >> k;
    genf();
    precalc();
    for(i = 1; i <= n; i++){
        for(j = 1; j <= k; j++) fin >> a[i][j];
    }
    rez = ((c[s][k] - s * k - 1) % mod + mod) % mod;
    backt(1,0);
    fout << rez;
    return 0;
}