Cod sursa(job #2808801)

Utilizator Andrei012Trache Andrei Andrei012 Data 25 noiembrie 2021 16:09:54
Problema Cowfood Scor 18
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <bits/stdc++.h>

using namespace std;
#define mod 3210121
ifstream in("cowfood.in");
ofstream out("cowfood.out");
int a[33][33],fact[40501],max1[40];

int lgput(int base, int  put){
    int ans=1;
    for(int i=0;(1<<i)<=put;++i)
    {
        if(((1<<i)&put)>0)
            ans=(1LL*ans*base)%mod;
        base=(1LL*base*base)%mod;
    }
    return ans;
}
int comb(int n,int k){
    return (1LL*((1LL*fact[n]*lgput(fact[k],mod-2))%mod)*lgput(fact[n-k],mod-2))%mod;
}

int main()
{
    int n,k,S,sum,total,scazut,bits,i,j,z,nr,semn;
    in>>k>>S>>n;
    fact[0]=1;
    fact[1]=1;
    for(i=2;i<=40000;++i)
        fact[i]=(1LL*fact[i-1]*i)%mod;
    for(i=1;i<=n;++i)
        for(j=1;j<=k;++j){
            in>>a[i][j];
            a[i][0]+=a[i][j];
        }
    scazut=0;
    total=0;
    for(i=k;i<=S;++i)
        total=(1LL*total+1LL*comb(i-1,k-1))%mod;
    scazut=0;
    int mask;
    ///calc cat trb sa scad din total
    for(mask=1;mask<(1<<n);++mask){
        memset(max1,0,sizeof(max1));
        bits=0;
        ///vad ce configuratii din cele n date iau (ce submultime)
        for(j=1;j<=n;++j)
            if((1<<(j-1)&mask)>0)
            {
                ///calc intersectia
                ++bits;
                for(z=1;z<=k;++z)
                    max1[z]=max(max1[z],a[j][z]);
            }
        nr=0;
        ///daca e nr imp de submultimi e cu + in fata daca nu e cu - in fata
        semn=-1;
        if(bits%2==1)
            semn=1;
        ///calc suma intersectiei
        sum=0;
        for(z=1;z<=k;++z)
            sum+=max1[z];
        ///daca suma e buna calc cate am in plus din intersectie
        if(sum<=S)
        {
            for(j=0;j<=S-sum;++j)
                nr=(1LL*nr+1LL*comb(j+k-1,k-1))%mod;
            scazut=(1ll*scazut+1LL*semn*nr+1LL*mod)%mod;
        }
    }
    out<<(total-scazut+mod)%mod;
    return 0;
}