Cod sursa(job #2136122)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 19 februarie 2018 17:49:02
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#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;
}