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