#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; } |
English