Cod sursa(job #2809336)

Utilizator grecu_tudorGrecu Tudor grecu_tudor Data 26 noiembrie 2021 18:18:16
Problema Cowfood Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

ifstream fin( "cowfood.in" );
ofstream fout( "cowfood.out" );

const int MAXS = 10005;
const int MAXK = 35;
const int MAXN = 25;
const int MOD = 3210121;

int cnt[MAXN][MAXK];
int comb[MAXS + MAXK][MAXK];

void precalc() {
  for ( int i = 1; i < MAXS + MAXK; ++i ) {
	comb[i][1] = i;
    for ( int j = 2; j < MAXK; ++j ) {
      comb[i][j] = (comb[i - 1][j] + comb[i - 1][j - 1]) % MOD;
    }
  }
}

int sum[MAXN];
//tle
int sb( int n, int k ) {
  return comb[n + k - 1][k - 1];
}

int main() {
  int k, s, n, bad = 0;

  fin >> k >> s >> n;
  for ( int i = 0; i < n; ++i ) {
	for ( int j = 0; j < k; ++j ) {
	  fin >> cnt[i][j];
	}
  }
  precalc();
  sum[0] = 1;
  for ( int i = 1; i <= s; ++i ) {
    sum[i] = (sum[i-1] + sb(i, k)) % MOD;
  }
  for ( int mask = 1; mask < (1 << n); ++mask ) {
	vector<int> a(k);
	for ( int i = 0; i < n; ++i ) {
	  if ( (mask >> i) & 1 ) {
        for ( int j = 0; j < k; ++j ) {
	      a[j] = max(a[j], cnt[i][j]);
		}
	  }
	}
	int sp = 0;
    for ( auto val : a ) {
	  sp += val;
	}
	if ( s >= sp ) {
      bad = (bad + sum[s - sp]) % MOD;
    }
  }
  bad = (bad + 1 + s * k) % MOD;
  fout << (sum[s] - bad + MOD) % MOD;
  fin.close();
  fout.close();
  return 0;
}