Pagini recente » Cod sursa (job #1720149) | Cod sursa (job #104313) | Cod sursa (job #305764) | Statistici Fratila Vlad (VladMedias) | Cod sursa (job #1683989)
# include <bits/stdc++.h>
# define MOD 3210121
# define NN 22
# define KK 32
# define NR 10005
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
int i,j,n,m,AUX,total,S,K,sol;
int current[KK], aux[NN][KK], v[NN][KK], dp[KK][NR];
void BACK (int niv, int nr) {
if (niv==n+1) {
if (nr==0) return;
int sum=0;
for (int i=1; i<=K; ++i)
sum+=current[i];
if (sum > S) return;
if (nr%2==1) AUX=(AUX + dp[K][S-sum] + MOD) % MOD;
else AUX=(AUX - dp[K][S-sum] + MOD) % MOD;
} else {
BACK (niv+1, nr); // nu mai adaug nimic
//il adaug pe niv
for (int i=1; i<=K; ++i) {
aux[niv][i]=current[i];
current[i]=max(current[i], v[niv][i]);
}
BACK (niv+1, nr+1);
for (int i=1; i<=K; ++i)
current[i]=aux[niv][i];
}
}
int main ()
{
f>>K>>S>>n;
for (int i=1; i<=n; ++i)
for (int j=1; j<=K; ++j)
f>>v[i][j];
//dp[i][j] - in cate moduri pot pune cel mult j bile in in i cutii
for (j=0; j<=S; ++j)
dp[0][j]=1;
for (i=1; i<=K; ++i) { // cutii
for (j=0; j<=S; ++j) { // bile
if (j==0) dp[i][j]=1;
else dp[i][j]=(dp[i][j-1] + dp[i-1][j])%MOD;
}
}
BACK (1, 0);
sol=(dp[K][S] - AUX + MOD)%MOD;
sol=(sol - S*K%MOD - 1) % MOD;
g<<sol<<"\n";
return 0;
}