Cod sursa(job #1502059)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 14 octombrie 2015 08:39:19
Problema Cowfood Scor 18
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
int N,K,S,ans;
int M[10005][35];
const int MOD = 3210121;
int s[25],X[35][35];
int Matrix[35][35],DP[10005][35],aux,sign=1;
void precalcM()
{
    for(int i=0;i<=K;i++)
        M[0][i]=1;
    for(int i=1;i<=S;i++)
        for(int j=1;j<=K;j++)
        {
            M[i][j]=M[i-1][j]+M[i][j-1];
            if(M[i][j]>=MOD)
                M[i][j]-=MOD;
        }

    for(int i=1;i<=S;i++)
        for(int j=1;j<=K;j++)
        {
            M[i][j]=M[i-1][j]+M[i][j];
            if(M[i][j]>=MOD)
                M[i][j]-=MOD;
        }

}
void precalcDP()
{
    for(int i=1;i<=S;i++)
        for(int j=1;j<=i;j++)
        {
            if(j==1)
                DP[i][j]=1;
            else
                DP[i][j]=DP[i][j-1]+DP[i-1][j];
            if(DP[i][j]>=MOD)
                DP[i][j]-=MOD;
            if(j==K)
                aux+=DP[i][j];
            if(aux>=MOD)
                aux-=MOD;
        }
}
void Read()
{
    f>>K>>S>>N;
    for(int i=1;i<=N;i++)
        for(int j=1;j<=K;j++)
            f>>Matrix[i][j];
}
void Back(int k)
{
    for(int i=s[k-1]+1;i<=N;i++)
    {
        s[k]=i;
        int sum=0;
        for(int j=1;j<=K;j++)
            X[k][j]=max(X[k-1][j],Matrix[i][j]),sum+=X[k][j];
        if(S>=sum)
            ans+=M[S-sum][K]*sign;
        while(ans<0)
            ans+=MOD;
        while(ans>=MOD)
            ans-=MOD;
        sign=-sign;
        if(k<N)
            Back(k+1);
        sign=-sign;
    }
}
int main()
{
    Read();
    precalcM();
    precalcDP();
    Back(1);
    g<<((aux-ans)+MOD)%MOD<<"\n";
    return 0;
}