#include <algorithm> #include <cstdio> using namespace std; int m, n, s, C[1000000], D[1000000]; int sprawdz(int l, int a, int b) { for (int i = a; i < b; ++i) { if (l < C[i]) return 1; if (l > D[i]) return 2; } return 0; } void podziel(int l, int p) { int ws; if (p == n) { if (l > m) { m = l; s = 1; } else if (l == m) { if (++s >= 1000000007) s %= 1000000007; } return; } if (l + n - p < m) return; if (C[p] > n - p) return; for (int i = C[p], j = min(D[p], n - p); i <= j; ++i) { ws = sprawdz(i, p, p + i); if (ws == 1) continue; if (ws == 2) break; podziel(l + 1, p + i); } } int main() { scanf("%d", &n); for (int i = 0; i < n; ++i) { scanf("%d %d", C + i, D + i); } m = s = 0; podziel(0, 0); if (m == 0) puts("NIE"); else printf("%d %d\n", m, s); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include <algorithm> #include <cstdio> using namespace std; int m, n, s, C[1000000], D[1000000]; int sprawdz(int l, int a, int b) { for (int i = a; i < b; ++i) { if (l < C[i]) return 1; if (l > D[i]) return 2; } return 0; } void podziel(int l, int p) { int ws; if (p == n) { if (l > m) { m = l; s = 1; } else if (l == m) { if (++s >= 1000000007) s %= 1000000007; } return; } if (l + n - p < m) return; if (C[p] > n - p) return; for (int i = C[p], j = min(D[p], n - p); i <= j; ++i) { ws = sprawdz(i, p, p + i); if (ws == 1) continue; if (ws == 2) break; podziel(l + 1, p + i); } } int main() { scanf("%d", &n); for (int i = 0; i < n; ++i) { scanf("%d %d", C + i, D + i); } m = s = 0; podziel(0, 0); if (m == 0) puts("NIE"); else printf("%d %d\n", m, s); return 0; } |