Cod sursa(job #911873)

Utilizator lianaliana tucar liana Data 11 martie 2013 22:04:59
Problema Cowfood Scor 52
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<stdio.h>
#define nmax 23
#define kmax 33
#define smax 10005
#define modulo 3210121
long k, s, n, nt, ng, i, j, sum, amax, nels;
long a[nmax][kmax], p[smax][kmax], sol[kmax], m[smax];

void citire()
{
    scanf("%ld %ld %ld",&k,&s,&n);
    for (i=1;i<=n;i++)
        for (j=1;j<=k;j++)
            scanf("%ld",&a[i][j]);
}

void precalculare()
{
    for (j=1;j<=k;j++)
        p[0][j]=1;
    for (i=1;i<=s;i++)
    {
       // p[i][0]=1;
        for (j=1;j<=k;j++)
        {
            p[i][j]=p[i-1][j]+p[i][j-1];
            if (p[i][j]>=modulo)
                p[i][j]-=modulo;
        }
    }
    m[0]=1;
    for (i=1;i<=s;i++)
    {
        m[i]=m[i-1]+p[i][k];
        if (m[i]>=modulo)
            m[i]-=modulo;
    }
}

void calculare()
{
    sum=s;
    for (i=1;i<=k;i++)
    {
        amax=0;
        for(j=1;j<=nels;j++)
            if (amax<a[sol[j]][i])
                amax=a[sol[j]][i];
        sum-=amax;
    }
    if (nels%2==1)
        ng=ng+m[sum];
    else
        ng=ng-m[sum];
    ng+=modulo;
    while (ng>=modulo)
        ng-=modulo;
}

void gen(long poz)
{
    long x;
    if (poz>1)
    {   nels=poz-1;  calculare();    }
    for (x=sol[poz-1]+1;x<=n;x++)
    {   sol[poz]=x; gen(poz+1); }
}

int main()
{
    freopen("cowfood.in","r",stdin);
    freopen("cowfood.out","w",stdout);
    citire();
    precalculare();
    gen(1);
    nt=(m[s]-k*s-1+modulo)%modulo;
    printf("%ld",(nt-ng+modulo)%modulo);
    return 0;
}