Cod sursa(job #3368307)

Utilizator amavutsiviatam-aulachitgaboriipetrusifilip amavutsiviata Data 14 octombrie 2026 10:48:14
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int nmax = 2e4 + 5;
const int mod = 3210121;

int f[nmax], inv[nmax];

int binpow(int b, int e){
    int ans = 1;
    while(e){
        if(e & 1){
            ans = ans * b % mod;
        }
        e >>= 1;
        b = b * b % mod;
    }
    return ans;
}

int v[25][35], ans, n, k, s;
int maxx[35];

int comb(int n, int k){
    return f[n] * inv[k] % mod * inv[n - k] % mod;
}

void bkt(int i, int cnt){
    if(i == n + 1){
        int sum = 0;
        for(int j = 1; j <= k; j++){
            sum += maxx[j];
        }
        if(sum > s) return;
        int contrib = comb(s - sum + k, k);
        if(cnt & 1){
            ans -= contrib;
            ans = (ans + mod) % mod;
        }
        else{
            ans = (ans + contrib) % mod;
        }
        return;
    }
    bkt(i + 1, cnt);
    vector<int> cop(k + 1);
    for(int j = 1; j <= k; j++){
        cop[j] = maxx[j];
        maxx[j] = max(maxx[j], v[i][j]); 
    }
    bkt(i + 1, cnt + 1);
    for(int j = 1; j <= k; j++)
        maxx[j] = cop[j];
}

signed main(){
    
    ifstream cin("cowfood.in");
    ofstream cout("cowfood.out");
    
    f[0] = 1;
    for(int i = 1; i < nmax; i++) f[i] = f[i - 1] * i % mod;
    inv[nmax - 1] = binpow(f[nmax - 1], mod - 2);
    for(int i = nmax - 1; i > 0; i--){
        inv[i - 1] = inv[i] * i % mod;
    }
    cin >> k >> s >> n;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= k; j++){
            cin >> v[i][j];
        }
    }
    bkt(1, 0);
    ans = (ans - 1 - k * s + mod) % mod;
    cout << ans << '\n';
    
    
    return 0;
}