Cod sursa(job #1497234)

Utilizator delia_99Delia Draghici delia_99 Data 6 octombrie 2015 15:01:28
Problema Cowfood Scor 28
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <cstdio>
#include <algorithm>
#define MOD 3210121
using namespace std;
int n,s,m,v[25][35],D[35][10010],a[35],sol,i,j,ord[35];

void slv(int nr,int sum)
{
    if (!nr) return;
    if(nr&1)
        sol=sol+D[n][s-sum];
    else sol=sol-D[n][s-sum]+MOD;
    if(sol>=MOD)
        sol-=MOD;
}

void backk(int k,int a[35],int nr,int sum)
{
    int crt[35],i;
    if(k==m+1)
    {
        slv(nr,sum);
        return;
    }
    for(i=1; i<=n; ++i)
        crt[i]=a[i];
    backk(k+1,crt,nr,sum);
    for(i=1; i<=n; ++i)
        if(crt[i]<v[ord[k]][i])
        {
            sum=sum-crt[i]+v[ord[k]][i];
            crt[i]=v[ord[k]][i];
        }
    if(sum<=s)
        backk(k+1,crt,nr+1,sum);
}

bool cmp(int a,int b)
{
    if(v[0][a]>v[0][b])
        return true;
    return false;
}

int main()
{
    freopen("cowfood.in","r",stdin);
    freopen("cowfood.out","w",stdout);
    scanf("%d%d%d",&n,&s,&m);
    for(i=1; i<=m; ++i)
    {
        for(j=1; j<=n; ++j)
        {
            scanf("%d",&v[i][j]);
            v[i][0]+=v[i][j];
        }
        ord[i]=i;
    }
    for(i=0; i<=n; ++i)
        D[i][0]=1;
    for(j=1; j<=s; ++j)
        D[0][j]=1;
    for(i=1; i<=n; ++i)
        for(j=1; j<=s; ++j)
        {
            D[i][j]=D[i-1][j]+D[i][j-1]+MOD;
            if(D[i][j]>=MOD)
                D[i][j]-=MOD;
        }

    sort(ord+1,ord+n+1,cmp);
    backk(1,a,0,0);
    sol = (D[n][s] - sol + MOD) % MOD;
    sol=(1LL*sol-1LL*n*s+1LL*n*MOD-1LL)%MOD;
    printf("%d\n",sol);
    return 0;
}