Pagini recente » Cod sursa (job #2946693) | Cod sursa (job #3287702) | Cod sursa (job #1854050) | Cod sursa (job #1891739) | Cod sursa (job #3292602)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
const int LMAX = 10;
const int INF = 0x3f3f3f3f;
const ll MOD = 3210121;
ll v[LMAX*2 + 5][LMAX*3 + 5], dp[10005], aux[LMAX*3 + 5];
//|Ai| --> nr de submultimi care nu mai pot fi generate
//dp[i] --> nr de a face sume din k termeni, mai mici sau egale cu i
int main() {
ll n, s, k, i, j;
fin>>k>>s>>n;
for (i = 0; i < n; i++) {
for (j = 0; j < k; j++) {
fin>>v[i][j];
}
}
if (k > s) {
fout<<0;
return 0;
}
//i stars, k - 1 bars
//comb din i + k - 1 luate cate k - 1
ll u, d;
dp[0] = 1;
u = k;
d = 1;
for (i = 1; i <= s; i++) {
dp[i] = (dp[i - 1]*u/d)%MOD;
u++;
d++;
// fout<<dp[i]<<" ";
}
//sume partiale
for (i = 1; i <= s; i++) {
dp[i] = (dp[i - 1] + dp[i])%MOD;
}
ll ans = 0;
ll sign, sum;
for (int mask = 1; mask < (1<<n); mask++) {
sign = 0;
for (i = 0; (1<<i) <= mask; i++) {
if (mask&(1<<i)) {
for (j = 0; j < k; j++) {
aux[j] = max(aux[j], v[i][j]);
}
sign = 1 - sign;
}
}
sum = 0;
for (j = 0; j < k; j++) {
sum += aux[j];
aux[j] = 0;
}
// fout<<sum<<endl;
if (sum > s) continue;
// fout<<dp[s - sum]<<endl;
if (sign) {
ans = (ans + dp[s - sum])%MOD;
}
else {
ans = (ans - dp[s - sum])%MOD;
}
}
// fout<<ans<<endl;
ll ans2 = dp[s - k] - ans;
while (ans2 < 0) {
ans2 += MOD;
}
fout<<ans2;
fin.close();
fout.close();
return 0;
}