Cod sursa(job #3368368)

Utilizator andreidumitrache1709andreidumitrache andreidumitrache1709 Data 14 octombrie 2026 12:19:53
Problema Cowfood Scor 18
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <bits/stdc++.h>
using namespace std;

const int MAXK = 30;
const int MAXN = 20;
const int MAXS = 1e4;
const int MOD = 3210121;

int fact[2 * MAXS + 1] , inv[2 * MAXS + 1] , mat[MAXN + 1][MAXK + 1] , v[MAXK + 1];
int binpow( int b , int e ) {
    int ans = 1;
    while( e ) {
        if( e & 1 )
            ans = 1ll * ans * b % MOD;
        b = 1ll * b * b % MOD;
        e >>= 1;
    }
    return ans;
}
void init() {
    int i;
    fact[0] = 1;
    for( i = 1 ; i <= 2 * MAXS ; i++ )
        fact[i] = 1ll * fact[i - 1] * i % MOD;
    inv[2 * MAXS] = binpow( fact[2 * MAXS] , MOD - 2 );
    for( i = 2 * MAXS - 1 ; i >= 0 ; i-- )
        inv[i] = 1ll * inv[i + 1] * ( i + 1 ) % MOD;
}
int comb( int n , int k ) {
    if( n < 0 || k > n )
        return 0;
    return 1ll * fact[n] * inv[k] % MOD * inv[n - k] % MOD;
}
int main() {
    ifstream cin( "cowfood.in" );
    ofstream cout( "cowfood.out" );
    int k , s , n , i , l , c , sum , z , j;
    cin >> k >> s >> n;
    for( l = 1 ; l <= n ; l++ )
        for( c = 1 ; c <= k ; c++ )
            cin >> mat[l][c];
    // fac pinnex
    init();
    int ans = 0;
    ans = comb( s , k );
   // cout << s + k << ' ' << k << ' ' << comb( s , k ) << '\n';
    //cout << comb( 4 , 2 ) << '\n';
    for( i = 1 ; i < ( 1 << n ) ; i++ ) {
        for( j = 1 ; j <= k ; j++ )
            v[j] = 0;
        for( j = 0 ; ( 1 << j ) <= i ; j++ ) {
            if( i & ( 1 << j ) )
                for( z = 1 ; z <= k ; z++ )
                    v[z] = max( v[z] , mat[j + 1][z] );
        }
        sum = 0;
        for( j = 1 ; j <= k ; j++ )
            sum += v[j];
        sum = s - sum;
        if( __builtin_popcount( i ) % 2 == 0 ) {
            ans += comb( k + sum , k );
            //cout << k + sum << ' ' << k << ' ' << comb( k + sum , k ) << '\n';
            if( ans < 0 )
                ans += MOD;
        } else {
            ans -= comb( k + sum , k );
            //cout << k + sum << ' ' << k << ' ' << comb( k + sum , k ) << '\n';
            if( ans >= MOD )
                ans -= MOD;
        }
    }
    cout << ans << '\n';
    return 0;
}