Cod sursa(job #487007)

Utilizator freak93Adrian Budau freak93 Data 23 septembrie 2010 16:02:21
Problema Cowfood Scor 18
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<fstream>

using namespace std;

const char iname[]="cowfood.in";
const char oname[]="cowfood.out";
const int maxn=50;
const int maxs=10005;
const int mod=3210121;

ifstream f(iname);
ofstream g(oname);

int k,s,n,i,j,S,pos[maxn][maxs],a[maxn][maxn],rez,sgn,maxt[maxn],p;

int main()
{
    f>>k>>s>>n;
    pos[0][0]=1;
    pos[1][0]=1;
    for(i=1;i<=k;++i,pos[i][0]=1)
        for(j=1;j<=s;++j)
            pos[i][j]=(pos[i-1][j]+pos[i][j-1])%mod;

    for(i=1;i<=s;++i)
        pos[k][i]=(pos[k][i]+pos[k][i-1])%mod;

    for(i=0;i<n;++i)
        for(j=1;j<=k;++j)
            f>>a[i][j];

    rez=pos[k][s-2];
    for(i=1;i<(1<<n);++i)
    {
        sgn=0;
        memset(maxt,0,sizeof(maxt));
        for(j=0;j<n;++j)
            if((1<<j)&i)
            {
                ++sgn;
                for(p=1;p<=k;++p)
                    maxt[p]=max(maxt[p],a[j][p]);
            }
        S=s;
        for(j=1;j<=k;++j)
            S-=maxt[j];
        if(S>=0)
            if(sgn&1)
                rez-=pos[k][S],rez%=mod;
            else
                rez+=pos[k][S],rez%=mod;
    }
    if(rez<0)
        rez+=mod;
    g<<rez<<"\n";
}