#include<bits/stdc++.h>
using namespace std;
const int maxn=500009;
const long long MOD=1000'000'007;
vector<long long> D[maxn];
set<long long> S;
pair<long long, long long> polki[maxn];
long long ziomek[maxn*2];
bool odw[maxn];
long long silnia[maxn];
void DFS(long long v) {
odw[v]=1;
for(auto s:D[v]) {
if(!odw[s]) {
DFS(s);
}
}
}
void wypelnij_silnie(long long n) {
long long ile=1;
silnia[0]=1;
for(long long i=1; i<=n; i++) {
ile*=i;
ile%=MOD;
silnia[i]=ile;
}
}
long long pot(long long a, long long b) {
long long wyn=1;
while(b) {
if(b%2==1) {
wyn*=a;
wyn%=MOD;
}
a*=a;
a%=MOD;
b/=2;
}
return wyn;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
long long n, a, b;
cin >> n;
for(long long i=1; i<=n; i++) {
cin >> a >> b;
polki[i]={a, b};
ziomek[a]=i;
ziomek[b]=i;
}
wypelnij_silnie(n+1);
S.insert(-10000000);
S.insert(10000000);
for(long long i=n; i>=1; i--) {
while(*S.upper_bound(polki[i].first)<polki[i].second) {
a=*S.upper_bound(polki[i].first);
D[i].push_back(ziomek[a]);
S.erase(a);
}
S.insert(polki[i].first);
S.insert(polki[i].second);
}
long long ile, wszystkie, mianownik, wyn=0, wynteraz;
for(long long i=1; i<=n; i++) {
DFS(i);
ile=0;
for(long long j=1; j<=n; j++) {
if(odw[j]) {
ile++;
}
odw[j]=0;
}
ile--;
if(ile==0) {
wyn++;
wyn%=MOD;
continue;
}
wszystkie=n-1;
//cout << i << ' ' << ile << endl;
// wszystkie+1 nad ile+1
wynteraz=silnia[wszystkie+1];
mianownik=(silnia[ile+1]*silnia[wszystkie-ile])%MOD;
//cout << mianownik << endl;
mianownik=pot(mianownik, MOD-2);
wynteraz*=mianownik;
wynteraz%=MOD;
wynteraz*=silnia[ile];
wynteraz%=MOD;
wynteraz*=silnia[wszystkie-ile];
wynteraz%=MOD;
//wynteraz/=n!
mianownik=silnia[n];
mianownik=pot(mianownik, MOD-2);
wynteraz*=mianownik;
wynteraz%=MOD;
wyn+=wynteraz;
wyn%=MOD;
}
cout << wyn;
}
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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | #include<bits/stdc++.h> using namespace std; const int maxn=500009; const long long MOD=1000'000'007; vector<long long> D[maxn]; set<long long> S; pair<long long, long long> polki[maxn]; long long ziomek[maxn*2]; bool odw[maxn]; long long silnia[maxn]; void DFS(long long v) { odw[v]=1; for(auto s:D[v]) { if(!odw[s]) { DFS(s); } } } void wypelnij_silnie(long long n) { long long ile=1; silnia[0]=1; for(long long i=1; i<=n; i++) { ile*=i; ile%=MOD; silnia[i]=ile; } } long long pot(long long a, long long b) { long long wyn=1; while(b) { if(b%2==1) { wyn*=a; wyn%=MOD; } a*=a; a%=MOD; b/=2; } return wyn; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); long long n, a, b; cin >> n; for(long long i=1; i<=n; i++) { cin >> a >> b; polki[i]={a, b}; ziomek[a]=i; ziomek[b]=i; } wypelnij_silnie(n+1); S.insert(-10000000); S.insert(10000000); for(long long i=n; i>=1; i--) { while(*S.upper_bound(polki[i].first)<polki[i].second) { a=*S.upper_bound(polki[i].first); D[i].push_back(ziomek[a]); S.erase(a); } S.insert(polki[i].first); S.insert(polki[i].second); } long long ile, wszystkie, mianownik, wyn=0, wynteraz; for(long long i=1; i<=n; i++) { DFS(i); ile=0; for(long long j=1; j<=n; j++) { if(odw[j]) { ile++; } odw[j]=0; } ile--; if(ile==0) { wyn++; wyn%=MOD; continue; } wszystkie=n-1; //cout << i << ' ' << ile << endl; // wszystkie+1 nad ile+1 wynteraz=silnia[wszystkie+1]; mianownik=(silnia[ile+1]*silnia[wszystkie-ile])%MOD; //cout << mianownik << endl; mianownik=pot(mianownik, MOD-2); wynteraz*=mianownik; wynteraz%=MOD; wynteraz*=silnia[ile]; wynteraz%=MOD; wynteraz*=silnia[wszystkie-ile]; wynteraz%=MOD; //wynteraz/=n! mianownik=silnia[n]; mianownik=pot(mianownik, MOD-2); wynteraz*=mianownik; wynteraz%=MOD; wyn+=wynteraz; wyn%=MOD; } cout << wyn; } |
English