Cod sursa(job #2065587)

Utilizator Bodo171Bogdan Pop Bodo171 Data 13 noiembrie 2017 21:50:07
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.66 kb
#include <iostream>
#include<fstream>
#include<bitset>
#include<cassert>
using namespace std;
int n,i,sum,s,k,j,x,a[25][35],t[25][35],v[35],modes[35][10005],nr,comb,tot,suma[10005],num,len;
const int mod=3210121;
void precalcdp(int nrr)
{
    for(i=0;i<=k;i++)
        for(j=0;j<=s;j++)
    {
        modes[i][j]=0;
    }
    modes[1][nrr]=1;
    for(i=1;i<=k;i++)//modes[i][j]-j scris ca suma de i numere
    {
        for(j=nrr;j<=s;j++)
     {
        if(j!=0) {modes[i][j]+=modes[i][j-1];}//adaugam 1 la un nr
        modes[i][j]%=mod;
        modes[i+1][j+nrr]+=modes[i][j];//adaugam un nr
     }
    }
}
int solve()
{
    sum=0;
    for(j=1;j<=k;j++)
    {
        sum+=t[len][j];
    }
    if(s-sum<0) return 0;
    return (suma[s-sum]%mod);
}
void bk(int x)
{
    if(len!=0)
    {
       for(j=1;j<=k;j++)
        t[len][j]=max(t[len-1][j],a[v[x-1]][j]);
        num=solve();
        if(len%2==0) tot+=num;
        else tot-=num;
        tot%=mod;
        if(tot<0) tot+=mod;
    }
    for(int i=v[x-1]+1;i<=n;i++)
       {
            v[x]=i;
            len++;
            bk(x+1);
            len--;
       }
}
int main()
{
    ifstream f("cowfood.in");
    ofstream g("cowfood.out");
    f>>k>>s>>n;
    for(i=1;i<=n;i++)
    {
      for(j=1;j<=k;j++)
      {
          f>>a[i][j];
      }
    }
    precalcdp(0);
    for(i=1;i<=s;i++)
    {
        tot+=modes[k][i];
        tot%=mod;
    }
    precalcdp(0);
    for(i=0;i<=s;i++)
    {
        suma[i]+=modes[k][i];
        if(i>=1) suma[i]+=suma[i-1];
        suma[i]%=mod;
    }
    nr=0;len=0;
    bk(1);
    g<<(tot-k*s+3*mod)%mod;
    return 0;
}