Cod sursa(job #3224862)

Utilizator ililogIlinca ililog Data 16 aprilie 2024 13:15:22
Problema Cowfood Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
using namespace std;
#include<iostream>
#include<fstream>

ifstream fin("cowfood.in");
ofstream fout("cowfood.out");

#define mod 3210121

int K, N, S;
long long ans;
int v[22][32];
int dp[10001][32]; ///nr de moduri de a pune maxim i obiecte in j cutii
void citire() {
    fin >> K >> S >> N;
    
    for (int i = 0; i<K; i++) {
        for (int j = 0; j<N; j++) {
            fin >> v[i][j];
        }
    }
}

void faDP() {
    for (int i = 1; i<=K+1; i++) {
        dp[0][i] = 1;
        dp[1][i] = i;
    }
    
    for (int i = 1; i<=S; i++) {
        dp[i][1] = 1;
    }
    
    for (int i = 2; i<=S; i++) {
        for (int j = 2; j<=K+1; j++) {
            dp[i][j] = dp[i-1][j] + dp[i][j-1];
            dp[i][j] %= mod;
        }
    }
}

int main() {
    citire();
    faDP();
    
    for (int mask = 0; mask < (1<<K); mask++) {
        long long p = 1;
        int suma = S;
        //cout << mask << endl;
        for (int poz = 0; poz<N; poz++) {
            int maxim = 1;
            for (int i = 0; i<K; i++) {
                if (mask & (1<<i)) {
                    maxim = max(maxim, v[i][poz]);
                }
            }
            suma -= maxim;
            //cout << maxim << " " << suma << endl;
        }
        if (suma < 0) {
            continue;
        }
        
        p = dp[suma][N+1];
        //cout << p << endl << endl;
        
        int nrb = __builtin_popcount(mask);
        if (nrb % 2 == 0) {
            ans = (ans + p) % mod;
        } else {
            ans = (ans - p + mod) % mod;
        }
    }
    
    fout << ans;
    
    return 0;
}