Cod sursa(job #911904)

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

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])%modulo;
    }
    m[0]=1;
    for (i=1;i<=s;i++)
        m[i]=(m[i-1]+p[i][k])%modulo;
}

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

void gen(long poz)
{
    long x, i;
    if (poz>1)
    {   nels=poz-1;  calculare();    }
    for (x=sol[poz-1]+1;x<=n;x++)
    {
        for (i=1;i<=k;i++)
        {
            amax[poz][i]=amax[poz-1][i];
            if (amax[poz][i]<a[x][i])
                amax[poz][i]=a[x][i];
        }
        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)%modulo-1+modulo)%modulo;
    printf("%ld",(nt-ng+modulo)%modulo);
    return 0;
}