Cod sursa(job #2521764)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 11 ianuarie 2020 14:35:45
Problema Zoo Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <bits/stdc++.h>

FILE *in = fopen("ccm.in", "r"), *out = fopen("ccm.out", "w") ;

const int MAX = 18 ;
const int MOD = 9901 ;

int dpC[MAX][ (1 << MAX)], dpR[MAX][ (1 << MAX)] ;
std::vector <int> G[MAX] ;

void fix(int &x) {
        if (x >= MOD) {
                x -= MOD ;
        }
}

int main() {
        int n, m, e, x, y ;
        fscanf(in, "%d %d %d", &n, &m, &e) ;
        for (int i = 1 ; i <= e ; ++ i) {
                fscanf(in, "%d %d", &x, &y) ;
                G[x].push_back (y - 1) ;
        }
        for (int j = 0 ; j < (1 << m) ; ++ j) {
                dpR[0][j] = 1 ;
        }
        for (int i = 1 ; i <= n ; ++ i) {
                for (int j = 0 ; j < (1 << m) ; ++ j) {
                        dpC[i][j] = dpC[i - 1][j] ;
                        for (int k = 0 ; k < G[i].size() ; ++ k) {
                                if (j & (1 << G[i][k])) {
                                        dpC[i][j] = std::max(dpC[i][j], dpC[i - 1][j - (1 << G[i][k])] + 1) ;
                                }
                        }
                        if (dpC[i][j] == dpC[i - 1][j]) {
                                dpR[i][j] += dpR[i - 1][j] ;
                        }
                        for (int k = 0  ; k < G[i].size()  ; k++) {
                                if ((j & (1 << G[i][k])) && dpC[i - 1][j - (1 << G[i][k])] + 1 == dpC[i][j]) {
                                        dpR[i][j] += dpR[i - 1][j - (1 << G[i][k])] ;
                                        fix(dpR[i][j]) ;
                                }
                        }
                }
        }
        fprintf(out, "%d %d", dpC[n][(1 << m) - 1], dpR[n][(1 << m) - 1]) ;
}