Advertisement
jainbot27

Untitled

Apr 6th, 2021
695
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.72 KB | None | 0 0
  1.  
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. using ld = long double;
  6. using pii = pair<int, int>;
  7. #define f first
  8. #define s second
  9. #define F0R(i, n) for(int i = 0; i < n; ++i)
  10. #define FOR(i, a, b) for(int i = a; i < b; ++i)
  11.  
  12. const int MOD = 1e9 + 7;
  13. const ld eps = 1e-4;
  14. const int mxN = 41;
  15.  
  16. int mul(int x, int y){
  17.     return (1LL*x*y)%MOD;
  18. }
  19.  
  20. int add(int x, int y){
  21.     x += y; if(x >= MOD) x -= MOD;
  22.     return x;
  23. }
  24.  
  25. int binpow(int x, int y){
  26.     int z = 1;
  27.     while(y > 0){
  28.         if(y%2==1){
  29.             z = mul(z, x);
  30.         }
  31.         x = mul(x, x);
  32.         y /= 2;
  33.     }
  34.     return z;
  35. }
  36.  
  37. int inv(int x){
  38.     return binpow(x, MOD-2);
  39. }
  40.  
  41. ld sq(int x){
  42.     return x*x;
  43. }
  44.  
  45. ld dist(pii A, pii B){
  46.     return sqrt(sq(B.f-A.f)+sq(B.s-A.s));
  47. }
  48.  
  49. struct tri{
  50.     pii a, b, c; int ia, ib, ic;
  51.     ld area;
  52.     tri(pii A, pii B, pii C, int IA = -1, int IB = -1, int IC = -1) : a(A), b(B), c(C), ia(IA), ib(IB), ic(IC) {
  53.         ld ab = dist(a, b), bc = dist(b, c), ca = dist(c, a);
  54.         ld semi = (ab+bc+ca)/2;
  55.         area = sqrt(semi*(semi-ab)*(semi-bc)*(semi-ca));
  56.     }
  57.     bool operator < (tri other){
  58.         return area < other.area;
  59.     }
  60. };
  61.  
  62. bool inside(tri a, pii b){
  63.     tri A(a.a, a.b, b);
  64.     tri B(a.a, a.c, b);
  65.     tri C(a.b, a.c, b);
  66.     ld tot = A.area+B.area+C.area;
  67.     return abs(a.area-tot) <= eps;
  68. }
  69.  
  70. int fac[mxN];
  71. int ifac[mxN];
  72.  
  73. int choose(int n, int k){
  74.     return mul(mul(fac[n], ifac[k]), ifac[n-k]);
  75. }
  76.  
  77. int n;
  78. vector<pii> v;
  79. vector<tri> t;
  80. int amt[mxN][mxN][mxN];
  81. int ind[mxN][mxN][mxN];
  82. vector<int> dp;
  83.  
  84.  
  85. int main(){
  86.     ios_base::sync_with_stdio(0); cin.tie(0);
  87.     cout << fixed << setprecision(4);
  88.     fac[0] = 1;
  89.     FOR(i, 1, mxN) fac[i] = mul(fac[i-1], i);
  90.     ifac[mxN-1] = inv(fac[mxN-1]);
  91.     for(int i = mxN - 2; i >= 0; i--) {
  92.         ifac[i] = mul((i+1),ifac[i+1]);
  93.         //cout << ifac[i] << ' ' ;
  94.     }
  95.     //cout << endl;
  96.     cin >> n;
  97.     v.resize(n);
  98.     F0R(i, n){
  99.         cin >> v[i].f >> v[i].s;
  100.     }
  101.     F0R(i, n){
  102.         F0R(j, i){
  103.             F0R(k, j){
  104.                 tri T(v[i], v[j], v[k], i, j, k);
  105.                 t.push_back(T);
  106.                 int tot = 0;
  107.                 F0R(l, n){
  108.                     if(l==i||l==j||l==k) continue;
  109.                     if(inside(T, v[l])){
  110.                         tot++;
  111.                     }
  112.                 }
  113.                 amt[i][j][k] = amt[i][k][j] = amt[j][i][k] = amt[j][k][i] = amt[k][i][j] = amt[k][j][i] = tot;
  114.             }
  115.         }
  116.     }
  117.  
  118.     sort(t.begin(), t.end());
  119.     dp.resize(t.size());
  120.     F0R(i, (int)t.size()){
  121.         ind[t[i].ia][t[i].ib][t[i].ic] = i;
  122.         ind[t[i].ib][t[i].ia][t[i].ic] = i;
  123.         ind[t[i].ia][t[i].ic][t[i].ib] = i;
  124.         ind[t[i].ib][t[i].ic][t[i].ia] = i;
  125.         ind[t[i].ic][t[i].ib][t[i].ia] = i;
  126.         ind[t[i].ic][t[i].ia][t[i].ib] = i;
  127.     }
  128.     if(amt[t.back().ia][t.back().ib][t.back().ic] != n-3) {
  129.         cout << "0\n";
  130.         return 0;
  131.     }
  132.     F0R(i, (int)t.size()){
  133.         tri& c = t[i];
  134.         int q = amt[c.ia][c.ib][c.ic];
  135.         dp[i] = add(dp[i], mul(mul(choose(n-3, q), fac[q]), 6));
  136.         F0R(j, n){
  137.             if(j!=c.ia&&j!=c.ib&&j!=c.ic){
  138.                 if(inside(c, v[j])) continue;
  139.                 int A = c.ia, B = c.ib, C = c.ic;
  140.                 if(inside(tri(v[B], v[C], v[j]), v[A])) swap(A, C);
  141.                 else if(inside(tri(v[A], v[C], v[j]), v[B])) swap(B, C);
  142.                 if(inside(tri(v[A], v[B], v[j]), v[C])){
  143.                     int dif = amt[A][B][j]-q-1;
  144.                     dp[ind[A][B][j]] = add(dp[ind[A][B][j]], mul(dp[i], mul(choose(n-4-q, dif), fac[dif])));
  145.                 }
  146.             }
  147.         }
  148.     }
  149.     cout << dp.back() << "\n";
  150. }
  151.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement