Cod sursa(job #1492356)

Utilizator cojocarugabiReality cojocarugabi Data 27 septembrie 2015 16:49:56
Problema Cowfood Scor 18
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
# include <bits/stdc++.h>
using namespace std;
const int mod = 3210121;
ifstream fi("cowfood.in");
ofstream fo("cowfood.out");
int fact[12345];
int invs[12345];
int pow(int a,int b,int mod)
{
    int ans = 1;
    while (b)
    {
        if (b&1) ans = (1ll * a * ans) % mod;
        a = (1ll * a * a) % mod;
        b /= 2;
    }
    return ans;
}
int C(int n,int k,int mod)
{
    return (((1ll * fact[n] * invs[n - k]) % mod) * invs[k]) % mod;
}
int s[12345];
int v[44][44];
const int p_1[] = {1,-1};
int main(void)
{
    fact[0] = invs[0] = 1;
    for (int i = 1;i <= 1e4+33;++i)
        fact[i] = (1ll * fact[i-1] * i) % mod,invs[i] = pow(fact[i],mod - 2,mod);
    int n,sum,k;
    fi>>k>>sum>>n;
    for (int i = 1;i <= 1e4+33;++i)
        s[i] = (s[i-1] + C(i-1,k-1,mod)) % mod;
    int ans = s[sum];
    for (int i = 0;i < n;++i)
        for (int j = 1;j <= k;++j)
            fi>>v[i][j];
    int tot = 1 << n;
    for (int bit = 1;bit < tot;++bit)
    {
        int p[44];
        fill(p+1,p+k+1,0);
        int cnt = 0;
        for (int i = 0;i < n;++i) cnt += (bit >> i) & 1;
        for (int i = 0;i < n;++i)
            if ((bit >> i) & 1)
                for (int j = 1;j <= k;++j)
                        p[j] = max(p[j],v[i][j]);
        int ss = 0;
        for (int i = 1;i <= k;++i)
            ss += p[i];
        ss = sum - ss;
        if (ss >= 0) ans = (ans + mod + p_1[cnt&1] * s[ss+k]) % mod;
    }
    return fo << ans << '\n',0;
}