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