#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define all(x) (x).begin(), (x).end() #define mid ((l+r)/2) #define siz(x) (int)(x).size() #define BOOST ios_base::sync_with_stdio(0), cin.tie(0) #define deb(x) cout << #x << ": " << x << "\n" typedef long long ll; typedef long double ld; typedef pair<int, int> ii; const int N = 7e4 + 5, mod = 1e9 + 7; // struct modus{ // int value; // modus(int value = 0) : value(value) {}; // modus operator+(const modus &x) const { // return (value + x.value)%mod; // } // modus operator*(const modus &x) const { // return ((ll)value * x.value)%mod; // } // modus operator-(const modus &x) const { // return ((value - x.value) + mod)%mod; // } // }; ii t[N]; bitset<N> bit[N]; int p[N]; // modus p[N]; set<ii> s; int n; int mpow(int x, int p){ if(p == 0) return 1; if(p&1) return (ll)mpow(x, p-1)*x %mod; int res = mpow(x, p>>1); return (ll)res*res %mod; } // modus mpow(modus x, int p){ // if(p == 0) return 1; // if(p&1) return mpow(x, p-1)*x; // modus res = mpow(x, p>>1); // return res*res; // } int inv(int x){ return mpow(x, mod-2); } int go(int x){ return (ll)p[n]*inv(x+1) %mod; } int main(){ BOOST; p[0] = 1; for(int i=1; i<N; i++){ p[i] = (ll)p[i-1]*i %mod; } cin >> n; for(int i=0; i<n; i++){ int l, r; cin >> l >> r; t[i] = {l, r}; } reverse(t, t+n); int ans = 0; for(int i=0; i<n; i++){ while(1){ auto x = s.lower_bound({t[i].fi, 0}); if(x == s.end()) break; if((*x).fi > t[i].se) break; // printf("koniec %d jest nad {%d, %d}\n", (*x).fi, t[i].fi, t[i].se); bit[i] |= bit[(*x).se]; bit[i][(*x).se] = 1; s.erase(x); } ans = (ans + go(bit[i].count())) %mod; // printf("bit[i].count() = %ld\n", bit[i].count()); // printf("i = %d, ans = %d\n", i, ans.value); s.insert({t[i].fi, i}); s.insert({t[i].se, i}); } // printf("ans = %d\n", ans.value); ans = (ll)ans*inv(p[n]) %mod; cout << ans << "\n"; }
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 | #include <bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define all(x) (x).begin(), (x).end() #define mid ((l+r)/2) #define siz(x) (int)(x).size() #define BOOST ios_base::sync_with_stdio(0), cin.tie(0) #define deb(x) cout << #x << ": " << x << "\n" typedef long long ll; typedef long double ld; typedef pair<int, int> ii; const int N = 7e4 + 5, mod = 1e9 + 7; // struct modus{ // int value; // modus(int value = 0) : value(value) {}; // modus operator+(const modus &x) const { // return (value + x.value)%mod; // } // modus operator*(const modus &x) const { // return ((ll)value * x.value)%mod; // } // modus operator-(const modus &x) const { // return ((value - x.value) + mod)%mod; // } // }; ii t[N]; bitset<N> bit[N]; int p[N]; // modus p[N]; set<ii> s; int n; int mpow(int x, int p){ if(p == 0) return 1; if(p&1) return (ll)mpow(x, p-1)*x %mod; int res = mpow(x, p>>1); return (ll)res*res %mod; } // modus mpow(modus x, int p){ // if(p == 0) return 1; // if(p&1) return mpow(x, p-1)*x; // modus res = mpow(x, p>>1); // return res*res; // } int inv(int x){ return mpow(x, mod-2); } int go(int x){ return (ll)p[n]*inv(x+1) %mod; } int main(){ BOOST; p[0] = 1; for(int i=1; i<N; i++){ p[i] = (ll)p[i-1]*i %mod; } cin >> n; for(int i=0; i<n; i++){ int l, r; cin >> l >> r; t[i] = {l, r}; } reverse(t, t+n); int ans = 0; for(int i=0; i<n; i++){ while(1){ auto x = s.lower_bound({t[i].fi, 0}); if(x == s.end()) break; if((*x).fi > t[i].se) break; // printf("koniec %d jest nad {%d, %d}\n", (*x).fi, t[i].fi, t[i].se); bit[i] |= bit[(*x).se]; bit[i][(*x).se] = 1; s.erase(x); } ans = (ans + go(bit[i].count())) %mod; // printf("bit[i].count() = %ld\n", bit[i].count()); // printf("i = %d, ans = %d\n", i, ans.value); s.insert({t[i].fi, i}); s.insert({t[i].se, i}); } // printf("ans = %d\n", ans.value); ans = (ll)ans*inv(p[n]) %mod; cout << ans << "\n"; } |