Cod sursa(job #2785093)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 17 octombrie 2021 22:53:43
Problema Cowfood Scor 14
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <bits/stdc++.h>

#define int long long

using namespace std;

using ll = long long;

const int mod = 3210121;
const int maxS = (int)1e4;
const int maxN = 30;

int n, s, k;

int c[maxS + maxN + 5][maxN + 5], addM[maxS + maxN + 5];

int m[maxN + 5][maxN + 5];

int st[maxN + 5][maxN + 5];

void add(int &a, int b) {
  a += b;
  if (a >= mod) {
    a -= mod;
  }
}

int bkt(int p, int mask) {
  if (p == n) {
    int pw = ((__builtin_popcount(mask) % 2 == 0) ? 1 : -1), sum = s;
    for (int i = 0; i < k; i++) {
      sum -= st[p][i];
    }
    if (sum < 0) {
      return 0;
    }
    return pw * addM[sum];
  }
  for (int i = 0; i < k; i++) {
    st[p + 1][i] = st[p][i];
  }
  int x = bkt(p + 1, mask);
  for (int i = 0; i < k; i++) {
    st[p + 1][i] = max(m[p][i], st[p][i]);
  }
  return (x + bkt(p + 1, (mask | (1 << p)))) % mod;
}

signed main() {
  freopen("cowfood.in", "r", stdin);
  freopen("cowfood.out", "w", stdout);
  cin >> n >> s >> k;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < k; j++) {
      cin >> m[i][j];
    }
  }
  for (int i = 0; i <= s + k; i++) {
    c[i][0] = 1;
    for (int j = 1; j <= min(i, k); j++) {
      add(c[i][j], c[i - 1][j]);
      add(c[i][j], c[i - 1][j - 1]);
    }
  }
  addM[0] = 1;
  for (int i = 1; i <= s + k; i++) {
    add(addM[i], addM[i - 1]);
    add(addM[i], c[i + k - 1][k - 1]);
  }
  cout << (bkt(0, 0) - k * s - 1 + mod + mod) % mod << "\n";
  return 0;
}