Pagini recente » Cod sursa (job #2873353) | Cod sursa (job #483396) | Cod sursa (job #1915387) | Cod sursa (job #1422052) | Cod sursa (job #3133579)
#include <fstream>
using namespace std;
ifstream in("cowfood.in");
ofstream out("cowfood.out");
const int maxN = 10005, mod = 3210121;
int p, sum, n, a[35][35], tot[35][35];
int dp[35][maxN];
int ans;
void check(int on)
{
int s = 0, nenul = 0;
for(int i = 1; i <= p; i++)
{
s += tot[n][i];
if(tot[n][i] > 0)
nenul++;
}
if(nenul < 2 || s > sum)
return;
if(on % 2 == 1)
ans -= dp[p][sum - s];
if(on % 2 == 0)
ans += dp[p][sum - s];
if(ans < 0)
ans += mod;
if(ans >= mod)
ans -= mod;
}
void bkt(int k, int on)
{
for(int i = 1; i <= p; i++)
tot[k][i] = tot[k - 1][i];
if(k == n)
check(on);
else
bkt(k + 1, on);
for(int i = 1; i <= p; i++)
tot[k][i] = max(tot[k - 1][i], a[k][i]);
if(k == n)
check(on + 1);
else
bkt(k + 1, on + 1);
}
int main()
{
in >> p >> sum >> n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= p; j++)
in >> a[i][j];
dp[0][0] = 1;
for(int i = 1; i <= p; i++)
{
dp[i][0] = 1;
for(int j = 1; j <= sum; j++)
dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % mod;
}
for(int j = 1; j <= sum; j++)
dp[p][j] = (dp[p][j] + dp[p][j - 1]) % mod;
ans = (dp[p][sum] - (sum * p + 1) % mod + mod) % mod;
if(n != 0)
bkt(1, 0);
out << ans;
return 0;
}