Cod sursa(job #1670823)

Utilizator george_stelianChichirim George george_stelian Data 1 aprilie 2016 01:42:33
Problema Cowfood Scor 76
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int mod=3210121;
int v[25][35],comb[10100][35],v1[35],aux[25][35],n,k,s,sol;

void back(int poz,int nr)
{
    if(poz==n+1)
    {
        if(nr==0) return;
        int a=s+k;
        for(int i=1;i<=k;i++) a-=v1[i];
        if(nr&1) sol+=comb[a][k];
        else sol-=comb[a][k];
        if(sol>=mod) sol-=mod;
        if(sol<mod) sol+=mod;
    }
    else
    {
        back(poz+1,nr);
        for(int i=1;i<=k;i++) aux[poz][i]=v1[i];
        for(int i=1;i<=k;i++) v1[i]=max(v1[i],v[poz][i]);
        back(poz+1,nr+1);
        for(int i=1;i<=k;i++) v1[i]=aux[poz][i];
    }
}

int main()
{
    freopen("cowfood.in", "r", stdin);
    freopen("cowfood.out", "w", stdout);
    scanf("%d%d%d",&k,&s,&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=k;j++) scanf("%d",&v[i][j]);
    for(int i=0;i<=s+k;i++) comb[i][0]=1;
    for(int i=1;i<=s+k;i++)
        for(int j=1;j<=min(i,k);j++) comb[i][j]=(comb[i-1][j]+comb[i-1][j-1])%mod;
    back(1,0);
    sol=((comb[s+k][k]-1-s*k-sol)%mod+mod)%mod;
    printf("%d",sol);
    return 0;
}