Cod sursa(job #2988768)

Utilizator AlexandruBenescuAlexandru Benescu AlexandruBenescu Data 5 martie 2023 14:26:33
Problema Cowfood Scor 18
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <bits/stdc++.h>
#define MOD 3210121
#define N 25
#define K 35
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");

int k, s, n;
int v[N][K], w[K], inv_fact[K];

inline void clear_w(){
  for (int i = 1; i <= k; i++)
    w[i] = 0;
}

int qexp(int a, int b){
  int r = 1;
  while (b){
    if (b % 2 == 1)
      r = (1LL * r * a) % MOD;
    a = (1LL * a * a) % MOD;
    b /= 2;
  }
  return r;
}

void calc_inv_fact(){
  int p = 1;
  for (int i = 2; i <= k; i++)
    p = (1LL * i) % MOD;
  inv_fact[k] = qexp(p, MOD - 2);
  for (int i = k - 1; i >= 0; i--)
    inv_fact[i] = (1LL * inv_fact[i + 1] * (i + 1)) % MOD;
}

int main(){
  fin >> k >> s >> n;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= k; j++)
      fin >> v[i][j];

  calc_inv_fact();
  long long ans = 0;
  for (int mask = 1; mask < (1 << n); mask++){
    clear_w();
    int cnt = 0;
    for (int bit = 0; bit < n; bit++){
      if ((1 << bit) & mask){
        for (int i = 1; i <= k; i++)
          w[i] = max(w[i], v[bit + 1][i]);
        cnt++;
      }
    }
    int sum = s;
    for (int i = 1; i <= k; i++)
      sum -= w[i];
    int x = inv_fact[k];
    for (int i = sum + 1; i <= sum + k; i++)
      x = (1LL * x * i) % MOD;
    ans = (ans + MOD + 1LL * (cnt % 2 * 2 - 1) * x) % MOD;
  }
  int x = inv_fact[k];
  for (int i = s - k + 1; i <= s; i++)
    x = (1LL * x * i) % MOD;
  ans = (x + MOD - ans) % MOD;
  fout << ans << "\n";
  return 0;
}