Cod sursa(job #1550917)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 14 decembrie 2015 21:58:21
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include<bits/stdc++.h>
using namespace std;

ifstream fin("cowfood.in");
ofstream fout("cowfood.out");

const int MODULO=3210121;
const int SMAX=10050;
const int NMAX=21;
const int KMAX=31;

int k,s,n,a[NMAX][KMAX],mn[KMAX];
int comb[SMAX][KMAX],part[SMAX];
int aux[NMAX][KMAX],sum[NMAX];//maxime partiale
int sol;

void Back(int poz,int cnt)
{
    if (sum[poz-1]>s) return;//nu are rost
    if (poz==n+1)
    {
        if (cnt&1) sol-=part[s-sum[poz-1]];
        else if (cnt) sol+=part[s-sum[poz-1]];
        if (sol<0) sol+=MODULO;
        if (sol>=MODULO) sol-=MODULO;
    }
    else
    {
        int i;
        sum[poz]=sum[poz-1];
        for (i=1;i<=k;i++) aux[poz][i]=aux[poz-1][i];
        Back(poz+1,cnt);

        sum[poz]=0;
        for (i=1;i<=k;i++) aux[poz][i]=max(aux[poz-1][i],a[poz][i]),sum[poz]+=aux[poz][i];
        Back(poz+1,cnt+1);
    }
}

int main()
{
    int i,j,ok=0,cnt;
    fin>>k>>s>>n;
    for (i=1;i<=k;i++) mn[i]=1<<30;
    for (i=1;i<=n;i++)
        {
            cnt=0;
            for (j=1;j<=k;j++)
                {
                    fin>>a[i][j];
                    if (a[i][j]) cnt++;
                }
            if (cnt==0) ok=1;
            if (cnt==1)
                for (j=1;j<=k;j++)
                    if (a[i][j])
                        mn[j]=min(mn[j],a[i][j]);
        }
    comb[0][0]=1;
    for (i=1;i<=(s+k);i++)
    {
        comb[i][0]=1;
        for (j=1;j<=k;j++)
        {
            comb[i][j]=comb[i-1][j]+comb[i-1][j-1];
            if (comb[i][j]>=MODULO) comb[i][j]-=MODULO;
        }
    }
    part[0]=1;
    for(i=1;i<=s;i++) part[i]=(part[i-1]+comb[i+k-1][k-1])%MODULO;
    sol=part[s];

    Back(1,0);

    if (ok==0) sol--;//0 full
    //scadem acelea cu 1 singur element nenul
    for (i=1;i<=s;i++)
        for (j=1;j<=k;j++)
            if (mn[j]>i)
                sol--;
    if (sol<0) sol+=MODULO;

    fout<<sol<<"\n";
    return 0;
}