Cod sursa(job #1756640)

Utilizator nurof3nCioc Alex Andrei nurof3n Data 13 septembrie 2016 11:41:27
Problema Cowfood Scor 48
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
const int MOD=3210121;
long long int K,S,N,m[21][31],sol,x[10001],dp[31][10001];
int main()
{
    f>>K>>S>>N;
   for(int i = 0; i <= S; i++)
        dp[0][i] = 1;
    for(int i = 1; i <= K; i++)
    {
        dp[i][0] = 1;
        for(int j = 1; j <= S; j++)
        {
            dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % MOD;
        }
    }
    sol=dp[K][S]-S*K-1;
    if(sol<0) sol+=MOD;
    for(int i=1;i<=N;i++)
        for(int j=1;j<=K;j++)
        f>>m[i][j];
    int nt = 1 << N;
    int card = 0;
    for(int i = 1; i < nt; i++)
    {
        long long int j = 0, p2, ndiv = 0, Max[31]={0};
        while((p2 = 1 << j) <= i)
        {
            if(p2 & i)
            {
                for(int k=1;k<=K;k++)
                    if(m[j+1][k]>Max[k]) Max[k]=m[j+1][k];
                ndiv++;
            }
            j++;
        }
        long long int sum=0;
        for(int k=1;k<=K;k++)
            sum+=Max[k];
        long long int prod=dp[K][S-sum];
        if(ndiv % 2 == 0)
            card += MOD-prod;
        else
            card += prod;
        card%=MOD;
    }
    sol+=MOD-card;
    sol%=MOD;
    g<<sol;
    return 0;
}