Cod sursa(job #1981133)

Utilizator TESTHARD123TEST CENTRE TESTHARD123 Data 14 mai 2017 20:53:13
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 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;
}