Pagini recente » Cod sursa (job #1192588) | Cod sursa (job #2394863) | Cod sursa (job #2169611) | Cod sursa (job #2905850) | Cod sursa (job #1492409)
# 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 back(int care,int p[],int semn,int cite)
{
if (n - care < cite) return 0;
if (care == n)
{
int ss = 0;
for (int i = 1;i <= k;++i) ss += p[i];
ss = sum - ss;
return (ss >= 0 ? s[ss+k] * semn + mod : 0) % mod;
}
int a[55];
int cnt = back(care+1,p,semn,cite);
for (int i = 1;i <= k;++i) a[i] = p[i],p[i] = max(p[i],v[care][i]);
cnt += back(care+1,p,-semn,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)
{
int p[55];
fill(p,p+55,0);
ans = (ans + back(0,p,1,i) + mod) % mod;
}
return fo << ans << '\n',0;
}