Cod sursa(job #595520)

Utilizator tiganu_dolarMancea Catalin tiganu_dolar Data 12 iunie 2011 22:14:04
Problema Cowfood Scor 8
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<stdio.h>

#define MOD 3210121
#define maxim(a,b) (a>b ? a : b)

int v[34],n,k;
int a[24][34];
int s,sol;
int d[34][10004];

void actual(int semn,int v[])
{
    if(!semn)
        semn--;
    int i,sum=0;
    for(i=1;i<=k;i++)
        sum+=v[i];
    if(sum<=s)
        sol+=d[k][s-sum]*semn;
    if(sol>=MOD)
        sol-=MOD;
    if(sol<0)
        sol+=MOD;
}

void back(int poz,int take,int v[])
{
    if(poz==n+1)
    {
        if(take)
            actual(take&1,v);
        return ;
    }
    back(poz+1,take,v);
    int i,cv[34];
    for(i=1;i<=k;i++)
        cv[i]=maxim(v[i],a[poz][i]);
    back(poz+1,take+1,cv);
}

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