Pagini recente » Cod sursa (job #1277911) | Cod sursa (job #1288398) | Cod sursa (job #1842024) | Cod sursa (job #1239006) | Cod sursa (job #3224862)
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;
}