Pagini recente » Cod sursa (job #351269) | Cod sursa (job #191317) | Cod sursa (job #430554) | Cod sursa (job #2150555) | Cod sursa (job #1550928)
# 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, int Sum = 0)
{
if (sz) {
if (Sum >= S) return;
int sum = 0;
for (int i=0;i<K;i++) sum += mx[i];
if (sum <= S) {
if (sz&1) { rs += dp[K][S-sum]; if (rs >= mod) rs -= mod; }
else { rs -= dp[K][S-sum]; if (rs < 0) rs += mod; }
}
// Sum = sum;
}
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++)
{
Sum = 0;
for (int j=0;j<K;j++) mx1[j] = max(mx1[j], a[val][j]), Sum += mx1[j];
sub[sz] = val;
back(sz+1, mx1, Sum);
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);
rs = dp[K][S] - rs;
rs --;
long long tmp = 0;
for(int i=0;i<K;i++) tmp += mn[i]-1;
tmp %= mod;
rs -= tmp;
if (rs < 0) rs += mod;
cout << rs;
return 0;
}