Cod sursa(job #2270687)

Utilizator patcasrarespatcas rares danut patcasrares Data 27 octombrie 2018 13:30:00
Problema Cowfood Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<fstream>
#include<iostream>
#include<unordered_map>
#define DN 10005
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
const int M=3210121;
int k,s,n,a[35][35],dp[35][DN],p,r[35][(1<<20)+5],pz[(1<<20)+5];
int poz,bit,semn,sum,rez;
int main()
{
    fin>>k>>s>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=k;j++)
            fin>>a[i][j];
    for(int i=0;i<=s;i++)
        dp[1][i]=i+1;
    for(int i=2;i<=k;i++)
    {
        for(int j=0;j<=s;j++)
            dp[i][j]=dp[i-1][j];
        for(int j=1;j<=s;j++)
            dp[i][j]=(dp[i][j]+dp[i][j-1])%M;
    }
    rez=(dp[k][s]+M-k*s-1)%M;
    cout<<rez<<'\n';
    p=(1<<n)-1;
    for(int i=0;i<n;i++)
        pz[(1<<i)]=i+1;
    for(int i=1;i<=k;i++)
    {
        for(int j=1;j<=p;j++)
        {
            bit=j&(-j);
            poz=pz[bit];
            r[i][j]=max(r[i][j^bit],a[i][poz]);
        }
    }
    for(int j=1;j<=p;j++)
    {
        semn=1;
        for(int i=1;i<=n;i++)
            if(j&(1<<(i-1)))
                semn=-semn;
        sum=s;
        for(int i=1;i<=k;i++)
        {
            sum-=r[i][j];
        }
        if(sum<0)
            continue;
        rez=(rez+M+semn*dp[k][sum])%M;
    }
    fout<<rez;
}