#include <iostream> #include <vector> #include <algorithm> #include <set> using namespace std; typedef pair<int, int> pii; typedef long long int ll; typedef long long int LL; const int MX = 100; const ll mod = 1e9+7; void dfs(bool [], int); int count(const vector<int> &); pii lvl[MX]; vector<int> adj[MX]; int count(const vector<int> &arr){ int ret = 0; bool vis[MX] {}; for(int p : arr){ if(!vis[p]){ ret++; dfs(vis, p); } } return ret; } void dfs(bool vis[], int x){ if(vis[x]) return; vis[x] = true; for(int y : adj[x]) dfs(vis, y); } ll fast(ll a, ll p){ ll res = 1; while(p > 0){ if(p % 2 == 1) res = (a * res)%mod; a = (a*a)%mod; p /= 2; } return res; } int main(){ int n; cin >> n; for(int i = 1; i <= n; i++){ cin >> lvl[i].first >> lvl[i].second; } vector<int> kol; for(int i = 1; i <=n ;i++){ kol.push_back(i); } vector<pii> drops; drops.push_back({lvl[n].first, n}); drops.push_back({lvl[n].second, n}); for(int i = n-1; i > 0; i--){ for(int k = 0; k < drops.size(); k++){ pii d = drops[k]; if(d.first > lvl[i].first and d.first < lvl[i].second){ adj[d.second].push_back(i); drops.erase(drops.begin()+k); k--; } } drops.push_back({lvl[i].first, i}); drops.push_back({lvl[i].second, i}); } ll res = 0; do{ res += count(kol); res %= mod; }while(next_permutation(kol.begin(), kol.end())); ll fact = 1; for(int i = 2; i <= n; i++) fact *= i; ll pow = fast(fact, mod-2); pow *= res; cout << pow%mod; return 0; }
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 | #include <iostream> #include <vector> #include <algorithm> #include <set> using namespace std; typedef pair<int, int> pii; typedef long long int ll; typedef long long int LL; const int MX = 100; const ll mod = 1e9+7; void dfs(bool [], int); int count(const vector<int> &); pii lvl[MX]; vector<int> adj[MX]; int count(const vector<int> &arr){ int ret = 0; bool vis[MX] {}; for(int p : arr){ if(!vis[p]){ ret++; dfs(vis, p); } } return ret; } void dfs(bool vis[], int x){ if(vis[x]) return; vis[x] = true; for(int y : adj[x]) dfs(vis, y); } ll fast(ll a, ll p){ ll res = 1; while(p > 0){ if(p % 2 == 1) res = (a * res)%mod; a = (a*a)%mod; p /= 2; } return res; } int main(){ int n; cin >> n; for(int i = 1; i <= n; i++){ cin >> lvl[i].first >> lvl[i].second; } vector<int> kol; for(int i = 1; i <=n ;i++){ kol.push_back(i); } vector<pii> drops; drops.push_back({lvl[n].first, n}); drops.push_back({lvl[n].second, n}); for(int i = n-1; i > 0; i--){ for(int k = 0; k < drops.size(); k++){ pii d = drops[k]; if(d.first > lvl[i].first and d.first < lvl[i].second){ adj[d.second].push_back(i); drops.erase(drops.begin()+k); k--; } } drops.push_back({lvl[i].first, i}); drops.push_back({lvl[i].second, i}); } ll res = 0; do{ res += count(kol); res %= mod; }while(next_permutation(kol.begin(), kol.end())); ll fact = 1; for(int i = 2; i <= n; i++) fact *= i; ll pow = fast(fact, mod-2); pow *= res; cout << pow%mod; return 0; } |