Cod sursa(job #1492414)

Utilizator cojocarugabiReality cojocarugabi Data 27 septembrie 2015 18:03:58
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.67 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 n,sum,k;
int p[33];
int back(int care,int cite)
{
    if (!cite)
    {
        int ss = 0;
        for (int i = 1;i <= k;++i) ss += p[i];
        ss = sum - ss;
        return (ss >= 0 ? s[ss+k]:0);
    }
    int a[55];
    int cnt = 0;
    if (n - care - 1 >= cite) cnt = back(care+1,cite);
    for (int i = 1;i <= k;++i) a[i] = p[i],p[i] = max(p[i],v[care][i]);
    cnt += back(care+1,cite-1);
    if (cnt >= mod) cnt -= mod;
    for (int i = 1;i <= k;++i) p[i] = a[i];
    return cnt;
}
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);
    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 = 0;
    for (int i = 1;i <= sum;++i)
        ans = (ans + C(i+k-1,k-1,mod)) % mod;
    ans = (ans + mod - k*sum) % mod;
    for (int i = 0;i < n;++i)
        for (int j = 1;j <= k;++j)
            fi>>v[i][j];
    for (int i = 1;i <= n;++i)
    {
        fill(p,p+33,0);
        ans = (ans + mod + p_1[i&1] * back(0,i)) % mod;
    }
    return fo << ans << '\n',0;
}