Pagini recente » Cod sursa (job #1831659) | Cod sursa (job #2390004) | Cod sursa (job #908338) | Cod sursa (job #3127235) | Cod sursa (job #477762)
Cod sursa(job #477762)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define nmax 21
#define kmax 32
#define smax 10002
#define mod 3210121
int K, S, N, sol;
int M[smax][kmax], P[smax][kmax], F[kmax], A[nmax][kmax];
void back(int niv, int sgn) {
int Fax[kmax], i, sum = 0;
if(niv == N + 1) {
for(i=1; i<=K; i++) {
sum += F[i];
}
if(!(sgn % 2)) {
if(S - sum >= 0) {
sol += M[S - sum][K];
sol %= mod;
}
}
else {
if(S - sum >= 0) {
sol -= M[S - sum][K];
if(sol < 0) sol += mod;
}
}
return;
}
back(niv + 1, sgn);
for(i=1; i<=K; i++) {
Fax[i] = F[i];
}
for(i=1; i<=K; i++) {
F[i] = max(F[i], A[niv][i]);
}
back(niv + 1, sgn + 1);
for(i=1; i<=K; i++) {
F[i] = Fax[i];
}
}
int main() {
FILE *f1=fopen("cowfood.in", "r"), *f2=fopen("cowfood.out", "w");
int i, j, p, q;
fscanf(f1, "%d %d %d\n", &K, &S, &N);
for(i=1; i<=N; i++) {
for(j=1; j<=K; j++) {
fscanf(f1, "%d", &A[i][j]);
}
}
P[0][0] = M[0][0] = 1;
for(i=1; i<=S; i++) {
M[i][0] = 1;
}
for(j=1; j<=K; j++) {
P[0][j] = M[0][j] = 1;
for(i=1; i<=S; i++) {
P[i][j] = M[i][j - 1];
M[i][j] = (M[i - 1][j] + P[i][j]) % mod;
}
}
back(1, 0);
sol -= (K*S + 1);
while(sol < 0) sol += mod;
fprintf(f2, "%d\n", sol);
fclose(f1); fclose(f2);
return 0;
}