Cod sursa(job #848658)

Utilizator DaNutZ2UuUUBB Bora Dan DaNutZ2UuU Data 5 ianuarie 2013 17:51:57
Problema Cowfood Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <iostream>
 
using namespace std;
 
#define MOD 3210121
 
int K, S, N;
int A[1002][22],
    Sum[1002][22];
int a[22][32],
    v[22][32];
int sol;
 
#define MAX(a, b) ((a>b) ? (a) : (b))
 
void solve(int nv, int sgn, int num) {
    for (int i = nv; i <= N; ++i) {
        int sum(0);
        for (int j(1); j <= K; ++j) {
            v[num+1][j] = MAX(v[num][j], a[i][j]);
            sum += v[num+1][j];
        }
        if (S-sum >= 0)
            sol = (sol + Sum[S-sum][K]*sgn + MOD) % MOD;
        solve(i+1, -1*sgn, num+1);
    }
}
 
int main(int argc, char *argv[]) {
    FILE *fi = fopen("cowfood.in", "r");
    fscanf(fi, "%d %d %d", &K, &S, &N);
    for (int i(1); i <= N; ++i)
        for (int j(1); j <= K; ++j)
            fscanf(fi, "%d", a[i]+j);
    fclose(fi);
 
    A[0][0] = Sum[0][0] = 1;
 
    for (int i(1); i <= S; ++i)
        Sum[i][0] = 1;
 
    for (int j(1); j <= K; ++j) {
        A[0][j] = Sum[0][j] = 1;
        for (int i(1); i <= S; ++i) {
            A[i][j] = Sum[i][j - 1];
            Sum[i][j] = (Sum[i - 1][j] + A[i][j]) % MOD;
        }
    }
 
    for (int i(2); i <= S; ++i)
        sol = (sol + A[i][K] - K + MOD) % MOD;
 
    solve(1, -1, 0);
 
    FILE *fo = fopen("cowfood.out", "w");
    fprintf(fo, "%d\n", sol);
    fclose(fo);
 
    return 0;
}