#include<bits/stdc++.h> using namespace std; #define F first #define S second const long long MOD=1e9+7; vector<int>graf[500005]; bool zal[500000]; long long pot(long long a, long long b) { long long res=1; while(b>0) { if(b&1) res=(res*a)%MOD; a=(a*a)%MOD; b>>=1; } return res; } void zalej(int w){ zal[w]=1; for(auto s:graf[w]){ if(zal[s]==0){ zalej(s); } } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n; cin>>n; vector<pair<int,int>> plat(n); vector<int>platf(2*n+1,-1); for(int i=0; i<n; i++) { cin>>plat[i].F>>plat[i].S; platf[plat[i].F]=i; platf[plat[i].S]=i; } set<int> konc; // int l0=0; // for(int i=n-1;i>=0;i--){ // konc.insert(plat[i].S); // konc.insert(plat[i].F); // if(next(konc.lower_bound(plat[i].F))==konc.lower_bound(plat[i].S)){ // l0++; // } // else konc.erase(next(konc.lower_bound(plat[i].F)),konc.lower_bound(plat[i].S)); // // konc.erase(next(konc.lower_bound(plat[i].F)),konc.upper_bound(plat[i].S)); // } // cout<<l0; //vector<int>graf[n]; for(int i=n-1;i>=0;i--){ konc.insert(plat[i].S); konc.insert(plat[i].F); for(auto it=next(konc.lower_bound(plat[i].F));*it!=plat[i].S;it++){ graf[platf[*it]].push_back(i); } if(next(konc.lower_bound(plat[i].F))!=konc.lower_bound(plat[i].S)) konc.erase(next(konc.lower_bound(plat[i].F)),konc.lower_bound(plat[i].S)); } vector<int> perm(n); for(int i=0;i<n;i++){ perm[i]=i; } long long sum=0; do{ long long wynp=0; for(int i=0;i<n;i++){ zal[i]=0; } for(int i=0; i<n; i++){ if(!zal[perm[i]]){ wynp++; zalej(perm[i]); } } sum=(sum+wynp)%MOD; }while(next_permutation(perm.begin(),perm.end())); long long sil=1; for(int i=2;i<=n;i++){ sil=(sil*i)%MOD; } sil=pot(sil,MOD-2); cout<<(sum*sil)%MOD; }
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 | #include<bits/stdc++.h> using namespace std; #define F first #define S second const long long MOD=1e9+7; vector<int>graf[500005]; bool zal[500000]; long long pot(long long a, long long b) { long long res=1; while(b>0) { if(b&1) res=(res*a)%MOD; a=(a*a)%MOD; b>>=1; } return res; } void zalej(int w){ zal[w]=1; for(auto s:graf[w]){ if(zal[s]==0){ zalej(s); } } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n; cin>>n; vector<pair<int,int>> plat(n); vector<int>platf(2*n+1,-1); for(int i=0; i<n; i++) { cin>>plat[i].F>>plat[i].S; platf[plat[i].F]=i; platf[plat[i].S]=i; } set<int> konc; // int l0=0; // for(int i=n-1;i>=0;i--){ // konc.insert(plat[i].S); // konc.insert(plat[i].F); // if(next(konc.lower_bound(plat[i].F))==konc.lower_bound(plat[i].S)){ // l0++; // } // else konc.erase(next(konc.lower_bound(plat[i].F)),konc.lower_bound(plat[i].S)); // // konc.erase(next(konc.lower_bound(plat[i].F)),konc.upper_bound(plat[i].S)); // } // cout<<l0; //vector<int>graf[n]; for(int i=n-1;i>=0;i--){ konc.insert(plat[i].S); konc.insert(plat[i].F); for(auto it=next(konc.lower_bound(plat[i].F));*it!=plat[i].S;it++){ graf[platf[*it]].push_back(i); } if(next(konc.lower_bound(plat[i].F))!=konc.lower_bound(plat[i].S)) konc.erase(next(konc.lower_bound(plat[i].F)),konc.lower_bound(plat[i].S)); } vector<int> perm(n); for(int i=0;i<n;i++){ perm[i]=i; } long long sum=0; do{ long long wynp=0; for(int i=0;i<n;i++){ zal[i]=0; } for(int i=0; i<n; i++){ if(!zal[perm[i]]){ wynp++; zalej(perm[i]); } } sum=(sum+wynp)%MOD; }while(next_permutation(perm.begin(),perm.end())); long long sil=1; for(int i=2;i<=n;i++){ sil=(sil*i)%MOD; } sil=pot(sil,MOD-2); cout<<(sum*sil)%MOD; } |