Cod sursa(job #937507)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 10 aprilie 2013 15:05:26
Problema Cowfood Scor 6
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
#define LE 10666
#define MOD 3210121
int result;
int a[66][66],n_pos,maxv[66];
int rest,k,s,n,i,j,t,total,nrbad;
bool viz[LE][LE];
int dp[LE][LE];

int memo(int i,int j)
{
    if (viz[i][j]==true)
        return dp[i][j];

    viz[i][j]=true;

  if (j>0)
    dp[i][j]+=memo(i,j-1);

  if (i>0)
    dp[i][j]+=memo(i-1,j);

    dp[i][j]%=MOD;

    return dp[i][j];
}

int main()
{
    f>>k>>s>>n;

dp[1][1]=1;
dp[0][1]=1;

    viz[1][1]=true;
    viz[0][1]=true;

    for(i=1; i<=s; ++i)
        for(j=1; j<=k; ++j)
            if (viz[i][j]==false)
                memo(i,j);

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

    for(i=2;i<=s;++i)
    {
      dp[i][k]+=dp[i-1][k];
      dp[i][k]%=MOD;
    }

    n_pos=(1<<n)-1;

    for(i=1; i<=n_pos; ++i)
    {
        int parity=0;
        total=0;

        for(j=1; j<=k; ++j)
            maxv[j]=0;

        for(j=0; j<n; ++j)
            if (i&(1<<j))
            {
                ++parity;
                for(t=1; t<=k; ++t)
                    maxv[t]=max(maxv[t],a[j+1][t]);
            }

        for(j=1; j<=k; ++j)
            total+=maxv[j];

        total=s-total;

        if (total<=0)
            continue;


        if (parity%2)
            nrbad+=dp[total][k];
        else
            nrbad-=dp[total][k];

        nrbad=(nrbad+MOD)%MOD;
    }

    result=(dp[s-k][k]-nrbad-n+MOD+MOD+1)%MOD;

    g<<result<<'\n';

    f.close();
    g.close();
    return 0;
}