Cod sursa(job #848096)

Utilizator danalex97Dan H Alexandru danalex97 Data 4 ianuarie 2013 20:25:29
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <fstream>
using namespace std;

ifstream F("cowfood.in");
ofstream G("cowfood.out");

const int Mod = 3210121;

const int Kmax = 35;
const int Smax = 10010;
const int Nmax = 25;

int K,S,N,Sol,Sum;
int CR[Kmax][Smax]; // combinari cu repetitie
int A[Nmax][Kmax],Stats[Kmax];

void Back(int Step,int Sign,int Stats[]) // O(2^N * K)
{
    if ( Step == N+1 )
    {
        Sum = S; for (int i=1;i<=K;++i) Sum -= Stats[i];
        if ( Sum >= 0 ) Sol = ( Sol + Sign * CR[K][Sum] + Mod ) % Mod;
        return;
    }

    Back(Step+1,Sign,Stats);

    int Next_Stats[Kmax];
    for (int i=1;i<=K;++i) Next_Stats[i] = max(Stats[i],A[Step][i]);

    Back(Step+1,-Sign,Next_Stats);
}

int main()
{
    F>>K>>S>>N;
    for (int i=1;i<=N;++i)
        for (int j=1;j<=K;++j)
            F>>A[i][j];
    for (int i=0;i<=S+1;++i)
        CR[0][i]=1;
    for (int i=1;i<=K+1;++i)
        for (int j=0;j<=S+1;++j)
            CR[i][j]=( CR[i-1][j] + ( j == 0 ? 0 : CR[i][j-1] ) ) % Mod;

    Sol =(Mod-S*K-1) % Mod;
    Back(1,1,Stats);

    G<<Sol<<'\n';

    F.close();
    G.close();
    return 0;
}