Cod sursa(job #2209287)

Utilizator lucametehauDart Monkey lucametehau Data 2 iunie 2018 16:35:39
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>

using namespace std;

ifstream cin ("cowfood.in");
ofstream cout ("cowfood.out");

const int NMAX = 20;
const int KMAX = 30;
const int SMAX = 10000;
const int MOD = 3210121;

int k, s, n;
int sol;

int solt[1 + NMAX];
int v[1 + NMAX][1 + KMAX];
int dp[1 + SMAX][1 + KMAX];
int Max[1 + NMAX][1 + KMAX];

void back(int niv) {
  if(niv) {
    for(int i = 1; i <= k; i++)
      Max[niv][i] = max(Max[niv - 1][i], v[solt[niv]][i]);
    int suma = 0;
    for(int i = 1; i <= k; i++)
      suma += Max[niv][i];
    if(suma <= s) {
      if(niv % 2 == 0)
        sol = (sol + dp[s - suma][k]) % MOD;
      else
        sol = (sol - dp[s - suma][k] + MOD) % MOD;
    }
  }
  if(niv < n) {
    for(int i = solt[niv] + 1; i <= n; i++) {
      solt[niv + 1] = i;
      back(niv + 1);
    }
  }
}

int main() {
  cin >> k >> s >> n;
  for(int i = 1; i <= n; i++) {
    for(int j = 1; j <= k; j++)
      cin >> v[i][j];
  }
  for(int i = 0; i <= s; i++)
    dp[i][1] = 1;
  for(int j = 2; j <= k; j++) {
    dp[0][j] = 1;
    for(int i = 1; i <= s; i++)
      dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % MOD;
  }
  for(int i = 1; i <= s; i++)
    dp[i][k] = (dp[i][k] + dp[i - 1][k]) % MOD;
  sol = (dp[s][k] - (s * k + 1) % MOD + MOD) % MOD;
  back(0);
  cout << sol;
  return 0;
}