Cod sursa(job #2297743)

Utilizator ScarymovieMocanu Alexandru Scarymovie Data 6 decembrie 2018 14:51:46
Problema Cowfood Scor 26
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>
#include<vector>
#define PRIM 3210121
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
int c[10031][31],k,S,n,a[20][30],st[31],Max[31][20],sgn=1,ans=0;
void calculeaza_comb()
{
    c[0][0]=1;
    for(int i=1; i<=k+S; ++i)
    {
        c[i][0]=1;
        for(int j=1; j<min(k+1,i); ++j)
            c[i][j]=(c[i-1][j-1]+c[i-1][j])%PRIM;
        if(i<=k+1)
            c[i][i]=1;
    }
    return ;
}
void backtr(int niv)
{
    for(int i=0; i<2; ++i)
    {
        st[niv]=i;
        for(int j=0; j<k; ++j)
            Max[niv][j]=max(Max[niv-1][j],i*a[niv][j]);
        sgn*=(1-2*i);
        if(niv<n)
            backtr(niv+1);
        else
        {
            int sum=0;
            for(int j=0; j<k; ++j)
                sum+=Max[niv][j];
            if(S-sum>=0)
            {
                ans+=sgn*c[k+S-sum][k];
                ans%=PRIM;
            }
        }
        sgn/=(1-2*i);
    }
}
int main()
{
    f>>k>>S>>n;
    for(int i=1; i<=n; ++i)
        for(int j=0; j<k; ++j)
            f>>a[i][j];
    calculeaza_comb();
    for(int j=0;j<k;++j) Max[0][j]=0;
    backtr(1);
    ans-=(S*k+1);
    ans%=PRIM;
    g<<ans<<'\n';
    return 0;
}