Cod sursa(job #2088630)

Utilizator MoodyFaresFares Mohamad MoodyFares Data 15 decembrie 2017 16:54:32
Problema Cowfood Scor 64
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#include <algorithm>

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

int N, K, S;
int a[1 + MAX_N][1 + MAX_K];
int cop[1 + MAX_N][1 + MAX_K];
int dp[1 + MAX_K][1 + MAX_S];
int v[1 + MAX_K];
int total;

void pinex(int pas, int nr) {
  if (pas == N + 1) {
    int s = 0;
    for (int i = 1; i <= K; i++) {
      s += v[i];
    }
    if (s <= S) {
      int sign;
      sign = (nr % 2 == 1) ? 1 : -1;
      total = (total + sign * dp[K][S - s]) % MOD;
    }
  } else {
    pinex(pas + 1, nr);
    for (int i = 1; i <= K; i++) {
      cop[pas][i] = v[i];
      v[i] = std::max(v[i], a[pas][i]);
    }
    pinex(pas + 1, nr + 1);
    for (int i = 1; i <= K; i++) {
      v[i] = cop[pas][i];
    }
  }
}

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 = 0; i <= S; i++) {
    dp[0][i] = 1;
  }
  for (int i = 1; i <= K; i++) {
    dp[i][0] = 1;
    for (int j = 1; j <= S; j++) {
      dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % MOD;
    }
  }
  total = 0;
  pinex(1, 1);
  int ans = (total - S * K - 1) % MOD;
  printf("%d\n", ans);
  return 0;
}