Pagini recente » Cod sursa (job #2534889) | Cod sursa (job #2725142) | Cod sursa (job #37105) | Cod sursa (job #2762816) | Cod sursa (job #2153611)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
const int smax = 10005;
const int mod = 3210121;
int N,K,S,ans;
int st[35], pred[35];
int a[25][35], dp[35][smax];
inline void Read()
{
int i,j;
fin >> K >> S >> N;
for(i = 1; i <= N; i++)
for(j = 1; j <= K; j++)
fin >> a[i][j];
}
inline void Fix(int &x)
{
if(x >= mod) x -= mod;
if(x < 0) x += mod;
}
inline void Compute_DP()
{
int i,j;
for(i = 0; i <= S; i++) dp[0][i] = 1;
for(i = 1; i <= K; i++)
{
dp[i][0] = 1;
for(j = 1; j <= S; j++)
{
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
Fix(dp[i][j]);
}
}
ans = dp[K][S] - 1 - K * S;
Fix(ans);
}
inline void Back(int top, int cnt)
{
int i, sum, sign;
if(top == N + 1)
{
sum = 0;
for(i = 1; i <= K; i++)
sum += st[i];
if(sum > S || sum == 0) return;
if(cnt & 1) sign = -1;
else sign = 1;
ans += (sign * dp[K][S - sum]);
Fix(ans);
return;
}
Back(top + 1, cnt);
for(i = 1; i <= K; i++)
pred[i] = st[i];
for(i = 1; i <= K; i++)
st[i] = max(st[i],a[top][i]);
Back(top + 1, cnt + 1);
for(i = 1; i <= K; i++)
st[i] = pred[i];
}
inline void Solve()
{
Back(1,0);
fout << ans << "\n";
}
int main()
{
Read();
Compute_DP();
Solve();
return 0;
}