Cod sursa(job #3145156)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 13 august 2023 11:54:13
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MOD 3210121
using namespace std;

int c[10101][31];
int maxs[21][31];
int sum[10101];
int a[21][31];
long long sol;
int n, k, s;

void init() {
   for(int i = 0; i < 10101; i++) {
      c[i][0] = 1;
      for(int j = 1; j <= min(i, 30); j++)
         c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % MOD; 
   }

   sum[0] = 1;
   for(int i = 1; i <= s; i++) 
      sum[i] = (c[i + k - 1][k - 1] + sum[i - 1 ]) % MOD;
}

void bt(int poz, int sign) {
   int i;
   if(poz == n + 1) {
      int s1 = s;
      for(int i = 1; i <= k; i++)
         s1 -= maxs[poz - 1][i];
      
      if(s1 >= 0) 
         sol = (sol + MOD + sum[s1] * sign) % MOD;
   } else {
      for(int i = 1; i <= k; i++) 
         maxs[poz][i] = maxs[poz - 1][i];
      
      bt(poz + 1, sign);
      for(int i = 1; i <= k; i++) 
         maxs[poz][i] = max(maxs[poz - 1][i], a[poz][i]);
      
      bt(poz + 1, -sign);
   }
}

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]);

   init();
   sol = (MOD * 2 - s * k - 1) % MOD;
   
   bt(1, 1);
   printf("%lld", sol);
   return 0;
}