Cod sursa(job #873374)

Utilizator vlad_DVlad Dumitriu vlad_D Data 7 februarie 2013 09:53:49
Problema Cowfood Scor 28
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#include <algorithm>

using namespace std;
int dp[31][10007];
int exp[21][31];
int mod = 3210121;
inline int cate(int N, int S) {
  if (S < 0) return 0;
  if (N == 1) return S + 1;
  if (dp[N][S]) return dp[N][S];
  dp[N][S] = 0;
  for (int i = 0; i <= S; ++i)
    dp[N][S] = (dp[N][S] + cate(N-1, S - i)) % mod;
  return dp[N][S];
}
int stack[32][32];
int K, S, N;
int ret;
void back(int k, int lst) {
  // evalueaza
  if (lst == N) {
    int T = S;
    for (int i = 1; i <= K; ++i) T -= stack[k][i];
    int semn = 1;
    if (k % 2) semn = -1;
    ret += semn * cate(K, T); while (ret < 0) ret += mod; while (ret >= mod) ret -= mod;
    return;
  }
  back(k, lst + 1);
  for (int i = 1; i <= K; ++i) stack[k+1][i] = max(stack[k][i], exp[lst + 1][i]);
  back(k + 1, lst + 1);
}
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", &exp[i][j]);
    /*
  for (int i = 0; i <= S; ++i) dp[1][i] = i + 1;
  for (int i = 1; i < K; ++i) {
    dp[i+1][0] = dp[i][0]; 
    int total = dp[i][0];
    for (int j = 1; j <= S; ++j) {
      total += dp[i][j];
      while (total > mod) total -= mod;
      dp[i+1][j] += total;
      while (dp[i+1][j] > mod) dp[i+1][j] -= mod;
    }
  }
  */
  back(0, 0);
  // 1 singur nul.
  ret -= K * S;//cate(K - 1, S - K + 1) * K;
  ret--;
  while (ret < 0) ret += mod;
  printf("%d\n", ret);
  return 0;
}