Cod sursa(job #1485933)

Utilizator enedumitruene dumitru enedumitru Data 13 septembrie 2015 13:49:55
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include<algorithm>
#include<fstream>
#define MOD 3210121
using namespace std;
ifstream f("cowfood.in"); ofstream g("cowfood.out");
int n,k,s,i,j,t,nr1,semn,tot,sum;
int d[10010][33];
int M[33],v[33][33],x[33];
inline int maxim(int a, int b) {return (a>b ? a : b);}
void back(int K)
{   int MA[33];
    if(K==n)
    {   if(nr1==0) return;
        sum = 0;
        for(int t=1;t<=k;t++) sum+=M[t];
        if(sum>s) return;
        if(nr1%2) semn=1; else semn=-1;
        tot+=(d[s-sum][k+1]*semn);
        if(tot<0) tot+=MOD;
        if(tot>=MOD) tot-=MOD;
    }
    else
    {   for(int y=0;y<=1;y++)
        {   x[K]=y;
            if(y==1)
            {   for(int i=1;i<=k;i++) {MA[i]=M[i]; M[i]=max(M[i],v[K][i]);}
                nr1++;
            }
            back(K+1);
            if(y == 1)
            {   for(int i=1;i<=k;i++) M[i] = MA[i];
                nr1--;
            }
        }
    }
}
int main()
{   f>>k>>s>>n;
    for(i=0;i<n;i++)
        for (j=1;j<=k;j++)
            f>>v[i][j];
    //D[i][j] = in cate moduri pot pune exact i bile identice in exact j cutii
    //in cutia j pot pune 0 bile si atunci conteaza D[i][j-1] sau cel putin o bila
    // caz in care bila i o pun in cutia j si atunci conteaza D[i-1][j]
    for(j=0;j<=k+1;j++) d[0][j]=1;
    for(i=1;i<=s+1;i++)
        for(j=0;j<=k+1;j++)
            if(j==1 || j==0) d[i][j]=1;
            else    if(i==1) d[i][j]=j;
                    else d[i][j] = (d[i-1][j]+d[i][j-1])%MOD;
    back(0);
    tot=d[s][k+1]-tot;
    if(tot<0) tot+=MOD;
    tot = tot - s * k - 1;
    if(tot<0) tot+=MOD;
    if(tot>=MOD) tot -= MOD;
    g<<tot<<'\n'; g.close();
    return 0;
}