#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair <int, int>; using pll = pair <ll, ll>; using pil = pair <int, ll>; const int inf = 1e9+7; const ll inf_ll = 1e18+7; void boost() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); } int n, l[500007], r[5000007], polka[500007]; bool odw[500007]; ll suma, liczba_permutacji, mod = 1e9+7; vector<int> g[500007], permutacja; ll potega(ll base, ll pot) { if (pot == 0) return 1; ll pom = potega(base, pot / 2); pom = (pom * pom) % mod; if (pot % 2 == 0) return pom; return (pom * base) % mod; } void dfs(int v) { odw[v] = true; for (int u: g[v]) { if (!odw[u]) dfs(u); } } int main() { boost(); cin >> n; for (int i = 1; i <= n; i++) { cin >> l[i] >> r[i]; if (polka[l[i]] != 0) g[i].push_back(polka[l[i]]); if (polka[r[i]] != 0) g[i].push_back(polka[r[i]]); for (int j = l[i]; j <= r[i]; j++) polka[j] = i; permutacja.push_back(i); } do { for (int i = 1; i <= n; i++) odw[i] = false; ll ile = 0; for (int x: permutacja) { if (!odw[x]) { dfs(x); ile++; } } suma += ile; suma %= mod; liczba_permutacji++; liczba_permutacji %= mod; } while (next_permutation(permutacja.begin(), permutacja.end())); cout << (suma * potega(liczba_permutacji, mod - 2)) % mod << "\n"; 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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair <int, int>; using pll = pair <ll, ll>; using pil = pair <int, ll>; const int inf = 1e9+7; const ll inf_ll = 1e18+7; void boost() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); } int n, l[500007], r[5000007], polka[500007]; bool odw[500007]; ll suma, liczba_permutacji, mod = 1e9+7; vector<int> g[500007], permutacja; ll potega(ll base, ll pot) { if (pot == 0) return 1; ll pom = potega(base, pot / 2); pom = (pom * pom) % mod; if (pot % 2 == 0) return pom; return (pom * base) % mod; } void dfs(int v) { odw[v] = true; for (int u: g[v]) { if (!odw[u]) dfs(u); } } int main() { boost(); cin >> n; for (int i = 1; i <= n; i++) { cin >> l[i] >> r[i]; if (polka[l[i]] != 0) g[i].push_back(polka[l[i]]); if (polka[r[i]] != 0) g[i].push_back(polka[r[i]]); for (int j = l[i]; j <= r[i]; j++) polka[j] = i; permutacja.push_back(i); } do { for (int i = 1; i <= n; i++) odw[i] = false; ll ile = 0; for (int x: permutacja) { if (!odw[x]) { dfs(x); ile++; } } suma += ile; suma %= mod; liczba_permutacji++; liczba_permutacji %= mod; } while (next_permutation(permutacja.begin(), permutacja.end())); cout << (suma * potega(liczba_permutacji, mod - 2)) % mod << "\n"; return 0; } |