Cod sursa(job #1154081)

Utilizator andrettiAndretti Naiden andretti Data 25 martie 2014 22:36:03
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<stdio.h>
#include<algorithm>
#define maxn 25
#define maxk 35
#define maxs 10005
#define MOD 3210121
using namespace std;

int n,S,K,fail,sol;
int a[maxn][maxk],dp[maxs][maxk];
int x[maxk],conf[maxn][maxk];

void read()
{
    scanf("%d%d%d",&K,&S,&n);
    for(int i=1;i<=n;i++)
     for(int j=1;j<=K;j++)
      scanf("%d",&a[i][j]);
}

void preproc()
{
    for(int i=1;i<=K+1;i++) dp[0][i]=1;
    for(int i=1;i<=S;i++) dp[i][1]=1;

    for(int i=1;i<=S;i++)
     for(int j=2;j<=K+1;j++)
      dp[i][j]=(dp[i-1][j]+dp[i][j-1])%MOD;
}

void back(int k,int sgn)
{
    if(k>1)
    {
        int sc=S;
        for(int i=1;i<=K;i++) sc-=conf[k-1][i];
        if(sc>=0) fail+=(sgn*dp[sc][K+1]);
        else return;
        if(fail<0) fail+=MOD; if(fail>=MOD) fail-=MOD;
    }
    if(k>n) return;
    for(int i=x[k-1]+1;i<=n;i++)
    {
        x[k]=i;
        for(int j=1;j<=K;j++) conf[k][j]=max(conf[k-1][j],a[i][j]);
        back(k+1,-sgn);
    }
}

int main()
{
    freopen("cowfood.in","r",stdin);
    freopen("cowfood.out","w",stdout);

    read();
    preproc();
    back(1,-1);

    sol=dp[S][K+1]-S*K-fail-1;
    while(sol<0) sol+=MOD;
    printf("%d",sol);

    fclose(stdin);
    fclose(stdout);
    return 0;
}