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