Pagini recente » Cod sursa (job #3192921) | Cod sursa (job #2297934) | Cod sursa (job #697353) | Cod sursa (job #892553) | Cod sursa (job #2136122)
#include<fstream>
#define mod 3210121
using namespace std;
int n, m, s, i, j, sum, sol, nr;
int a[25][35], fact[10100], mx[35], d[10005];
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
void invmod(int a, int b, int &x, int &y){
if(b == 0){
x = 1;
y = 0;
}
else{
int x2, y2;
invmod(b, a % b, x2, y2);
x = y2;
y = x2 - a / b * y2;
}
}
int comb(int n, int k){
int x, y, a;
a = fact[n - k] * 1LL * fact[k] % mod;
invmod(a, mod, x, y);
x %= mod;
if(x < 0){
x += mod;
}
return x * 1LL * fact[n] % mod;
}
void backt(int p, int nr){
if(p == m + 1){
sum = s;
for(int i = 1; i <= n; i++){
sum -= mx[i];
}
if(sum >= 0){
if(nr % 2 == 0){
sol += d[sum];
if(sol >= mod){
sol -= mod;
}
}
else{
sol -= d[sum];
if(sol < 0){
sol += mod;
}
}
}
}
else{
backt(p + 1, nr);
int i, aux[35];
for(i = 1; i <= n; i++){
aux[i] = mx[i];
mx[i] = max(mx[i], a[p][i]);
}
backt(p + 1, nr + 1);
for(i = 1; i <= n; i++){
mx[i] = aux[i];
}
}
}
int main(){
fin>> n >> s >> m;
for(i = 1; i <= m; i++){
for(j = 1; j <= n; j++){
fin>> a[i][j];
}
}
fact[0] = 1;
for(i = 1; i <= s + n; i++){
fact[i] = fact[i - 1] * 1LL * i % mod;
}
for(i = 0; i <= s; i++){
d[i] = comb(i + n, n);
}
d[s] -= (n * 1LL * s + 1) % mod;
if(d[s] < 0){
d[s] += mod;
}
backt(1, 0);
fout<< sol <<"\n";
return 0;
}