Cod sursa(job #3219629)

Utilizator Cazacu2006RazvanRazvan Cazacu Cazacu2006Razvan Data 31 martie 2024 20:32:50
Problema Cowfood Scor 14
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#define mod 3210121
#include <cstring>
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
int k,s,n,d[50][10001],dp[50][10001],Max[50],nr1,scz,sol[50];
struct numar
{
    int v[50];
}nr[50];
void backt(int pas)
{
    int v[31];

        for(int j=1;j<=k;j++)
        {
            if(sol[pas-1]==1)
            Max[j]=max(Max[j],nr[pas-1].v[j]);
            v[j]=Max[j];
        }

    if(pas==n+1)
    {
        if(nr1==0)
            return;
        int val=0;

        for(int j=1;j<=k;j++)
        {
         val=val+Max[j];


        }
        if(s>=val)
        {
            val=dp[k][s-val];

        if(nr1%2==0)
            val=-val;
        scz=(scz+val+mod)%mod;
        }

    }
    else
    {
        for(int j=0;j<=1;j++)
        {
            if(j==0)
            {
                backt(pas+1);
            }
            else
            {
                nr1++;
                sol[pas]=1;
                for(int i=1;i<=k;i++)
                {

                    Max[i]=max(Max[i],nr[pas].v[i]);
                }
                backt(pas+1);
                for(int i=1;i<=k;i++)
                    Max[i]=v[i];
                nr1--;
                sol[pas]=0;

            }
        }

    }
}
int main()
{
    fin>>k>>s>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=k;j++)
        {
            fin>>nr[i].v[j];
        }
    }

 for(int i=0;i<=k+1;i++)
    d[i][0]=1;
    for(int i=1;i<=s;i++)
    {

        for(int j=1;j<=k+1;j++)
        {


            d[j][i]=(d[j][i]+d[j-1][i]+d[j][i-1]);
            dp[j-1][i]=d[j][i];
        }

    }


    backt(1);
    int rasp=(dp[k][s-2]*(k*(k-1))/2)%mod;
    rasp=(rasp-scz+7*mod)%mod;

   fout<<rasp;




    return 0;
}