Pagini recente » Cod sursa (job #167967) | Cod sursa (job #161014) | Cod sursa (job #1279235) | Cod sursa (job #2788372) | Cod sursa (job #1550894)
# include <bits/stdc++.h>
using namespace std;
const int mod = 3210121;
int n, k, K, S, a[22][33], dp[33][10004];
int sz, sub[20];
long long rs = 0;
void back(int sz, vector < int > mx)
{
if (sz) {
int sum = S;
for (int i=0;i<K;i++) sum -= mx[i];
if (sum >= 0) {
if (sz&1) { rs += dp[K][sum]; if (rs >= mod) rs -= mod; }
else { rs -= dp[K][sum]; if (rs < 0) rs += mod; }
}
}
if (sz == n) return;
vector < int > mx1(K);
for(int i=0;i<K;i++) mx1[i] = mx[i];
int start = (sz == 0 ? 0 : sub[sz-1]+1);
for (int val = start; val < n; val++)
{
for (int j=0;j<K;j++) mx1[j] = max(mx1[j], a[val][j]);
sub[sz] = val;
back(sz+1, mx1);
for (int j=0;j<K;j++) mx1[j] = mx[j];
}
}
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;
}
vector< int > mx(K, 0);
back(0, mx);
/* 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;
}