Cod sursa(job #2338872)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 7 februarie 2019 21:42:00
Problema Cowfood Scor 52
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <bits/stdc++.h>
#define Int long long

using namespace std;

ifstream f("cowfood.in");
ofstream g("cowfood.out");

const int mod=3210121;

int k,s,n,i,j,ans,a[25][35],C[10040][35],b[35][1<<18];

int main()
{
    f>>k>>s>>n;
    for(i=0;i<=s+k;i++)
    {
        C[i][0]=1;
        for(j=1;j<=i&&j<=k;j++)
            C[i][j]=(C[i-1][j]+C[i-1][j-1]>=mod)?C[i-1][j]+C[i-1][j-1]-mod:C[i-1][j]+C[i-1][j-1];
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=k;j++)
            f>>a[i][j];
    memset(b,0,sizeof(b));
    for(int mask=1;mask<(1<<n);mask++)
    {
        int val=-1,ok=0,sum=0;
        for(i=1;i<=n;i++)
            if(mask&(1<<(i-1)))
            {
                val*=-1;
                if(!ok)
                {
                    for(j=1;j<=k;j++)
                    {
                        b[j][mask]=max(b[j][mask^(1<<(i-1))],a[i][j]);
                        sum+=b[j][mask];
                    }
                    ok=1;
                }
            }
//        g<<mask<<'\n';
//        for(j=1;j<=k;j++)
//            g<<b[j][mask]<<' ';g<<'\n';
        if(sum>s)continue;
        ans=(ans+C[s-sum+k][k]*val+mod)%mod;
    }
    g<<((C[s+k][k]-k*s-1-ans)%mod+mod)%mod;
    return 0;
}