Cod sursa(job #1501871)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 13 octombrie 2015 21:55:38
Problema Cowfood Scor 16
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 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[25];
int Matrix[35][35],DP[10005][35],aux;
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,int sign)
{
    int c[25];
    for(int i=1;i<=K;i++)
        c[i]=x[i];
    for(int i=s[k-1]+1;i<=N;i++)
    {
        s[k]=i;
        int sum=0;
        for(int j=1;j<=K;j++)
            x[j]=max(x[j],Matrix[i][j]),sum+=x[j];
        ans+=M[S-sum][K]*sign;
        while(ans<0)
            ans+=MOD;
        while(ans>=MOD)
            ans-=MOD;
        if(k<N)
            Back(k+1,-sign);
        for(int i=1;i<=K;i++)
            x[i]=c[i];
    }
}
int main()
{
    Read();
    precalcM();
    precalcDP();
    Back(1,1);
    g<<((aux-ans)+MOD)%MOD<<"\n";
    return 0;
}