// PA 2024 5B Kraniki
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <stack>
#include <unordered_map>
using namespace std;
#define QWE 1000000007
struct Shelf
{
int L, R;
bool flag;
vector<int> edges;
Shelf(int L, int R) {
this->L = L;
this->R = R;
flag = false;
}
};
int n, a, b;
vector<Shelf> shelves;
long long getInv(long long a, long long p) {
long long result;
if (p == 1) {
return a;
}
if (p % 2) {
result = getInv(a, p - 1);
result = (result * a) % QWE;
} else {
result = getInv(a, p / 2);
result = (result * result) % QWE;
}
return result;
}
void paint(int a) {
shelves[a].flag = true;
for (unsigned i = 0; i < shelves[a].edges.size(); ++i) {
if (shelves[shelves[a].edges[i]].flag == false) {
paint(shelves[a].edges[i]);
}
}
}
long long getResultForPerm(vector<int> *perm) {
for (int i = 0; i < n; ++i) {
shelves[i].flag = false;
}
long long result = 0;
for (int i = 0; i < n; ++i) {
if (shelves[(*perm)[i]].flag == false) {
++result;
paint((*perm)[i]);
}
}
return result;
}
void processAllPermutations(vector<int> *availShelves, vector<int> *perm, long long &result, long long &count)
{
vector<int> newAvailShelves;
if (availShelves->size() == 0) {
result = (result + getResultForPerm(perm)) % QWE;
count = (count + 1) % QWE;
return;
}
for (unsigned i = 0; i < availShelves->size(); ++i) {
newAvailShelves = (*availShelves);
newAvailShelves.erase(find(newAvailShelves.begin(), newAvailShelves.end(), (*availShelves)[i]));
perm->push_back((*availShelves)[i]);
processAllPermutations(&newAvailShelves, perm, result, count);
perm->pop_back();
}
}
int main()
{
ios_base::sync_with_stdio(0);
vector<int> availShelves;
vector<int> perm;
long long result;
long long count;
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> a;
cin >> b;
shelves.push_back(Shelf(a, b));
availShelves.push_back(i);
for (int j = i - 1; j >= 0; --j) {
if (shelves[i].L > shelves[j].L && shelves[i].L < shelves[j].R) {
shelves[i].edges.push_back(j);
break;
}
}
for (int j = i - 1; j >= 0; --j) {
if (shelves[i].R > shelves[j].L && shelves[i].R < shelves[j].R) {
shelves[i].edges.push_back(j);
break;
}
}
}
result = 0;
count = 0;
processAllPermutations(&availShelves, &perm, result, count);
cout << (result * getInv(count, QWE - 2)) % QWE << endl;
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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | // PA 2024 5B Kraniki #include <iostream> #include <string> #include <vector> #include <algorithm> #include <stack> #include <unordered_map> using namespace std; #define QWE 1000000007 struct Shelf { int L, R; bool flag; vector<int> edges; Shelf(int L, int R) { this->L = L; this->R = R; flag = false; } }; int n, a, b; vector<Shelf> shelves; long long getInv(long long a, long long p) { long long result; if (p == 1) { return a; } if (p % 2) { result = getInv(a, p - 1); result = (result * a) % QWE; } else { result = getInv(a, p / 2); result = (result * result) % QWE; } return result; } void paint(int a) { shelves[a].flag = true; for (unsigned i = 0; i < shelves[a].edges.size(); ++i) { if (shelves[shelves[a].edges[i]].flag == false) { paint(shelves[a].edges[i]); } } } long long getResultForPerm(vector<int> *perm) { for (int i = 0; i < n; ++i) { shelves[i].flag = false; } long long result = 0; for (int i = 0; i < n; ++i) { if (shelves[(*perm)[i]].flag == false) { ++result; paint((*perm)[i]); } } return result; } void processAllPermutations(vector<int> *availShelves, vector<int> *perm, long long &result, long long &count) { vector<int> newAvailShelves; if (availShelves->size() == 0) { result = (result + getResultForPerm(perm)) % QWE; count = (count + 1) % QWE; return; } for (unsigned i = 0; i < availShelves->size(); ++i) { newAvailShelves = (*availShelves); newAvailShelves.erase(find(newAvailShelves.begin(), newAvailShelves.end(), (*availShelves)[i])); perm->push_back((*availShelves)[i]); processAllPermutations(&newAvailShelves, perm, result, count); perm->pop_back(); } } int main() { ios_base::sync_with_stdio(0); vector<int> availShelves; vector<int> perm; long long result; long long count; cin >> n; for (int i = 0; i < n; ++i) { cin >> a; cin >> b; shelves.push_back(Shelf(a, b)); availShelves.push_back(i); for (int j = i - 1; j >= 0; --j) { if (shelves[i].L > shelves[j].L && shelves[i].L < shelves[j].R) { shelves[i].edges.push_back(j); break; } } for (int j = i - 1; j >= 0; --j) { if (shelves[i].R > shelves[j].L && shelves[i].R < shelves[j].R) { shelves[i].edges.push_back(j); break; } } } result = 0; count = 0; processAllPermutations(&availShelves, &perm, result, count); cout << (result * getInv(count, QWE - 2)) % QWE << endl; return 0; } |
English