Cod sursa(job #1754522)

Utilizator Bodo171Bogdan Pop Bodo171 Data 8 septembrie 2016 13:44:32
Problema Cowfood Scor 4
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <iostream>
#include<fstream>
using namespace std;
int n,i,sum,s,k,j,x,a[25][35],t[35],v[35],modes[35][10005],comb,nr,tot,suma[10005];
bool used[35];
const int mod=3210121;
void precalcdp(int nr)
{

     for(i=0;i<=k;i++)
        for(j=0;j<=s;j++)
    {
        modes[i][j]=0;
    }
    modes[nr][nr]=1;
    for(i=nr;i<=k;i++)
        for(j=0;j<=s;j++)
    {
        if(i>=1) modes[i][j]+=modes[i][j-1];
        modes[i+1][j+nr]+=modes[i][j];
       modes[i][j]%=mod;
    }
}
int solve()
{
    sum=0;
    for(j=1;j<=k;j++)
    {
        sum+=t[j];
    }
    if(s-sum<0) return 0;
    return suma[s-sum];
}
void bk(int x)
{
    if(x>=comb+1)
    {
        for(int i=1;i<=k;i++) t[i]=0;
        for(int i=1;i<=comb;i++)
        {
         for(j=1;j<=k;j++)
            if(a[v[i]][j]>t[j])
                t[j]=a[v[i]][j];
        }
        nr=solve();
        if(comb%2==0) tot+=nr;
        else tot-=nr;
        if(tot>=mod) tot-=mod;
        if(tot<0) tot+=mod;
    }
    else
    {
        for(int i=v[x-1]+1;i<=n;i++)
        {
            if(!used[i])
            {
                used[i]=1;
                v[x]=i;
                bk(x+1);
                used[i]=0;
            }
        }
    }
}
int main()
{
    ifstream f("cowfood.in");
    ofstream g("cowfood.out");
    f>>n>>s>>k;
    for(i=1;i<=n;i++)
    {
      for(j=1;j<=k;j++)
      {
          f>>a[i][j];
      }
    }
    precalcdp(1);
    for(i=1;i<=s;i++)
    {
        tot+=modes[k][i];
        tot%=mod;
    }
    precalcdp(0);
    for(i=0;i<=n;i++)
    {
        suma[i]=modes[k][i];
        if(i>=1) suma[i]+=suma[i-1];
        suma[i]%=mod;
    }
    for(comb=1;comb<=n;comb++)
    {
        bk(1);
    }
    g<<tot;
    return 0;
}