#include <bits/stdc++.h> using namespace std; using ll = long long; #define FOR(i,a,b) for(int i=a; i<=b; ++i) #define FORR(i,a,b) for(int i=a; i>=b; --i) #define pb push_back #define ssize(v) (int)(v.size()) constexpr int MAX_N=1e4+14, MOD=1e9+7;// !! small N struct lefRigS{ int l,r; }; int N, nrShlf[2*MAX_N]; ll rres=0, nFact=1; lefRigS flood[MAX_N]; bitset<MAX_N> used, flooded; vector<int> cCbn; ll QPow(ll a, ll b){ ll res=1, cMno=a; while(b){ if(b%2) res*=cMno; b/=2; res%=MOD; cMno*=cMno; cMno%=MOD; } return res; } void Input(){ int a, b; cin>>N; FOR(i,1,N){ nFact*=i; nFact%=MOD; cin>>a>>b; flood[i]={nrShlf[a-1],nrShlf[b]}; FOR(j,a,b-1) nrShlf[j]=i; } } void Flod(int v){ if(flooded[v]) return; flooded[v]=1; Flod(flood[v].l), Flod(flood[v].r); } void GetQt(){ FOR(i,1,N) flooded[i]=0; FOR(i,1,N){ if(!flooded[cCbn[i]]) ++rres; Flod(cCbn[i]); } rres%=MOD; } void DFS(int cV){ used[cV]=1; cCbn.pb(cV); if(ssize(cCbn)==N+1){ GetQt(); used[cV]=0; cCbn.pop_back(); return; } FOR(nV,1,N) if(!used[nV]) DFS(nV); used[cV]=0; cCbn.pop_back(); } void Solve(){ ll revNFact, res; DFS(0); revNFact=QPow(nFact,MOD-2); res=(rres*revNFact)%MOD; cout<<res<<"\n"; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0); Input(); Solve(); }
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 | #include <bits/stdc++.h> using namespace std; using ll = long long; #define FOR(i,a,b) for(int i=a; i<=b; ++i) #define FORR(i,a,b) for(int i=a; i>=b; --i) #define pb push_back #define ssize(v) (int)(v.size()) constexpr int MAX_N=1e4+14, MOD=1e9+7;// !! small N struct lefRigS{ int l,r; }; int N, nrShlf[2*MAX_N]; ll rres=0, nFact=1; lefRigS flood[MAX_N]; bitset<MAX_N> used, flooded; vector<int> cCbn; ll QPow(ll a, ll b){ ll res=1, cMno=a; while(b){ if(b%2) res*=cMno; b/=2; res%=MOD; cMno*=cMno; cMno%=MOD; } return res; } void Input(){ int a, b; cin>>N; FOR(i,1,N){ nFact*=i; nFact%=MOD; cin>>a>>b; flood[i]={nrShlf[a-1],nrShlf[b]}; FOR(j,a,b-1) nrShlf[j]=i; } } void Flod(int v){ if(flooded[v]) return; flooded[v]=1; Flod(flood[v].l), Flod(flood[v].r); } void GetQt(){ FOR(i,1,N) flooded[i]=0; FOR(i,1,N){ if(!flooded[cCbn[i]]) ++rres; Flod(cCbn[i]); } rres%=MOD; } void DFS(int cV){ used[cV]=1; cCbn.pb(cV); if(ssize(cCbn)==N+1){ GetQt(); used[cV]=0; cCbn.pop_back(); return; } FOR(nV,1,N) if(!used[nV]) DFS(nV); used[cV]=0; cCbn.pop_back(); } void Solve(){ ll revNFact, res; DFS(0); revNFact=QPow(nFact,MOD-2); res=(rres*revNFact)%MOD; cout<<res<<"\n"; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0); Input(); Solve(); } |