Cod sursa(job #2150670)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 3 martie 2018 18:25:06
Problema Cowfood Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 20;
const int MAX_K = 30;
const int MAX_S = 10000;
const int MOD = 3210121;

int c[MAX_S + MAX_K + 5][MAX_K + 5];
int sp[MAX_S + MAX_K + 5][MAX_K + 5];
int a[MAX_K + 5][MAX_N + 5];

int k, s, n;

int pinex() {
  int ns = (1 << n);
  int b[MAX_N + 5];
  int ans = 0;
  for (int i = 1; i < ns; ++i) {
    memset(b, 0, sizeof(b));
    int biti = 0;
    for (int j = 0; j < n; ++j)
      if (i & (1 << j)) {
        for (int t = 1; t <= k; ++t)
          b[t] = max(b[t], a[j + 1][t]);
        biti++;
      }
    int sum = 0;
    for (int j = 1; j <= n; ++j)
      sum += b[j];
    sum = s - sum;
    if (sum >= 0) {
      int aux = sp[sum + k - 1][k - 1] + 1;
      if (biti % 2 == 1)
        ans = ans + aux;
      else
        ans = ans - aux + MOD;
      if (ans >= MOD)
        ans -= MOD;
    }
  }
  return ans;
}

int main() {
  freopen("cowfood.in", "r", stdin);
  freopen("cowfood.out", "w", stdout);

  scanf("%d%d%d", &k, &s, &n);
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= k; ++j)
      scanf("%d", &a[i][j]);

  for (int i = 1; i <= s + k; ++i) {
    c[i][0] = 1;
    c[i][i] = 1;
    for (int j = 1; j < i && j <= k; ++j) {
      c[i][j] = c[i - 1][j] + c[i][j - 1];
      if (c[i][j] >= MOD)
        c[i][j] -= MOD;
      sp[i][j] = sp[i - 1][j] + c[i][j];
      if (sp[i][j] >= MOD)
        sp[i][j] -= MOD;
    }
  }

  printf("%d\n", (sp[s + k - 1][k - 1] - (k * s) % MOD + MOD - pinex() + MOD) % MOD);

  return 0;
}