Cod sursa(job #1495246)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 2 octombrie 2015 19:42:58
Problema Cowfood Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>
#define MOD 3210121
#define ub(i) (i&(-i))

using namespace std;

int Max[(1<<20)+1][32],nr,j,ans,a[32][32],n,i,m,s,Pos[10005][32];

inline void back(int nivel,int bit,int nr)
{
    if(nivel<=n)
    {
        back(nivel+1, bit<<1, nr);
        if(Max[bit][0]<=s) back(nivel+1, (bit<<1)+1, nr+1);
        return;
    }
    //bit>>=1;
    if(nr&1) ans=(ans-Pos[s-Max[bit][0]][m]+MOD)%MOD;
    else ans=(ans+Pos[s-Max[bit][0]][m])%MOD;
}
int main()
{
    freopen("cowfood.in","r",stdin);
    freopen("cowfood.out","w",stdout);

    scanf("%d%d%d",&m,&s,&n);

    for(i=1;i<=n;++i)
    for(j=1;j<=m;++j)
    scanf("%d",&a[i][j]);

    for(i=1;i<=m;++i) Pos[0][i]=1;

    for(i=1;i<=s;++i)
    for(j=1;j<=m;++j)
    Pos[i][j]=(Pos[i][j-1]+Pos[i-1][j])%MOD;

    for(i=1;i<=s;++i)
    for(j=1;j<=m;++j)
    Pos[i][j]=(Pos[i-1][j]+Pos[i][j])%MOD;
    int x=0;
    for(i=0;i<(1<<n);++i, x=ub(i))
    for(j=1;j<=m;++j)
    {
        if(Max[i-x][j]>a[x][j]) Max[i][j]=Max[i-x][j];
        else Max[i][j]=a[x][j];
        Max[i][0]+=Max[i][j];
    }

    ans=0;
    back(1,0,0);
  //  back(1,1,0);

    printf("%d\n",(ans-1-s*m+MOD)%MOD);
    return 0;
}