Pagini recente » Cod sursa (job #756442) | Cod sursa (job #418722) | Cod sursa (job #2874524) | Cod sursa (job #739675) | Cod sursa (job #1550859)
# include <bits/stdc++.h>
using namespace std;
const int mod = 3210121;
int n, k, K, S, a[22][33], dp[33][10004];
int main()
{
freopen("cowfood.in","r",stdin);
freopen("cowfood.out","w",stdout);
cin>>K>>S>>n;
int mn[33];
for (int i=0;i<=K;i++) mn[i] =S+1;
for (int i=0;i<n;i++)
{
int sum = 0, nr = 0, ps;
for(int j=0;j<K;j++) {
cin >> a[i][j]; sum += a[i][j];
if (a[i][j]) nr++, ps = j;
}
if(nr == 1) mn[ps] = min(mn[ps], a[i][ps]);
if (sum == 0) return cout << 0, 0;
}
for (int s=0;s<=S;s++) dp[1][s] = s+1;
for (int k=1;k<=K;k++) dp[k][0] = 1;
for (int k=2;k<=K;k++)
for (int s=1;s<=S;s++) {
dp[k][s] = dp[k-1][s] + dp[k][s-1];
if (dp[k][s] >= mod) dp[k][s] -= mod;
}
long long rs = 0;
int mx[33];
for (int conf=1;conf<(1<<n);conf++)
{
int nr = 0;
int sum = S;
memset(mx,0,sizeof(mx));
for (int i=0;i<n;i++) if ((1<<i)&conf)
{
nr++;
for (int j=0;j<K;j++) mx[j] = max(mx[j], a[i][j]);
}
int sgn = (nr&1 ? 1 : -1);
for (int i=0;i<K;i++) sum -= mx[i];
if (sum < 0) continue;
// cout << sum << " " << dp[K][sum] << endl;
if (nr&1) {
rs += dp[K][sum];
if (rs >= mod) rs -= mod;
//rs = (rs + dp[K][sum]) % mod;
}
else {
rs -= dp[K][sum];
if (rs < 0) rs += mod;
}
}
rs = dp[K][S] - rs;
rs --; // scad 000000..00
long long tmp = 0;
for(int i=0;i<K;i++) tmp += mn[i]-1; //, cout << mn[i] << " "; cout << endl;
tmp %= mod;
rs -= tmp;
if (rs < 0) rs += mod;
cout << rs;
return 0;
}