Cod sursa(job #839151)

Utilizator stoicatheoFlirk Navok stoicatheo Data 21 decembrie 2012 13:46:32
Problema Cowfood Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <algorithm>
#include <stdio.h>
 
#define restRez 3210121
 
using namespace std;
 
int k, s, n;
int sol;
int cant[32][32];
int sf[32];
int sum[32][10024];
 
inline void back(int level, int semn, int *act)
{
    if (level == n)
    {
        int sa = s;
        for (int i = 1; i <= k; i++)
            sa -= act[i];
 
        if (sa >= 0)
            sol = (sol + semn * sf[sa]) % restRez;
        return;
    }
     
    int past[32];
    for (int i = 1; i <= k; i++)
        past[i] = act[i];
    back(level + 1, semn, past);
 
    for (int i = 1; i <= k; i++)
        act[i] = max(act[i], cant[level][i]);
    back(level + 1, semn * (-1), act);
}
 
int main()
{
    freopen("cowfood.in", "r", stdin);
    freopen("cowfood.out", "w", stdout);
     
    scanf("%d %d %d", &k, &s, &n);
 
    for (int i = 0; i < n; i++)
        for (int j = 1; j <= k; j++)
            scanf("%d", &cant[i][j]);
 
    sum[0][0] = 1;
    for (int i = 1; i <= k; i++)
        for (int j = 0, sumP = 0; j <= s; j++)
            sum[i][j] = (sum[i][j - 1] + sum[i - 1][j]) % restRez;
 
    sf[0] = sum[k][0];
    for (int i = 1; i <= s; i++)
        sf[i] = (sf[i - 1] + sum[k][i]) % restRez;  
 
    int act[32];
    memset(act, 0, sizeof(act));
    back(0, 1, act);
 
    sol -= (k * s + 1);
    for (; sol < 0; sol += restRez);
 
    printf("%d\n", sol);
 
    fclose(stdin);
    fclose(stdout);
    return 0;
}