Pagini recente » Cod sursa (job #348537) | Cod sursa (job #2843044) | Cod sursa (job #156089) | Cod sursa (job #201078) | Cod sursa (job #2521764)
#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]) ;
}