Advertisement
mr_dot_convict

Timus-Ship-Routes-1172

Jun 5th, 2021
729
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.40 KB | None | 0 0
  1. #include     <bits/stdc++.h>
  2. #ifndef      CONVICTION
  3. #define      debug(x...)
  4. #endif
  5. #define IOS  ios_base::sync_with_stdio(false); cin.tie (nullptr)
  6. #define PREC cout.precision (10); cout << fixed
  7. #define F    first
  8. #define S    second
  9. #define Int  long long
  10. #define ff   long double
  11. using namespace std;
  12. //Don’t practice until you get it right. Practice until you can’t get it wrong
  13. struct bigint {
  14.    static const int base = 1000000000;
  15.    static const int base_digits = 9;
  16.    
  17.    vector<int> a;
  18.    int sign;
  19.    /*<arpa>*/
  20.    int size(){
  21.       if(a.empty())return 0;
  22.       int ans=(a.size()-1)*base_digits;
  23.       int ca=a.back();
  24.       while(ca)
  25.          ans++,ca/=10;
  26.       return ans;
  27.    }
  28.    bigint operator ^(const bigint &v){
  29.       bigint ans=1,a=*this,b=v;
  30.       while(!b.isZero()){
  31.          if(b%2)
  32.             ans*=a;
  33.          a*=a,b/=2;
  34.       }
  35.       return ans;
  36.    }
  37.    string to_string(){
  38.       stringstream ss;
  39.       ss << *this;
  40.       string s;
  41.       ss >> s;
  42.       return s;
  43.    }
  44.    int sumof(){
  45.       string s = to_string();
  46.       int ans = 0;
  47.       for(auto c : s)  ans += c - '0';
  48.       return ans;
  49.    }
  50.    /*</arpa>*/
  51.    bigint() :
  52.    sign(1) {
  53.    }
  54.    
  55.    bigint(long long v) {
  56.       *this = v;
  57.    }
  58.    
  59.    bigint(const string &s) {
  60.       read(s);
  61.    }
  62.    
  63.    void operator=(const bigint &v) {
  64.       sign = v.sign;
  65.       a = v.a;
  66.    }
  67.    
  68.    void operator=(long long v) {
  69.       sign = 1;
  70.       a.clear();
  71.       if (v < 0)
  72.          sign = -1, v = -v;
  73.       for (; v > 0; v = v / base)
  74.          a.push_back(v % base);
  75.    }
  76.    
  77.    bigint operator+(const bigint &v) const {
  78.       if (sign == v.sign) {
  79.          bigint res = v;
  80.          
  81.          for (int i = 0, carry = 0; i < (int) max(a.size(), v.a.size()) || carry; ++i) {
  82.             if (i == (int) res.a.size())
  83.                res.a.push_back(0);
  84.             res.a[i] += carry + (i < (int) a.size() ? a[i] : 0);
  85.             carry = res.a[i] >= base;
  86.             if (carry)
  87.                res.a[i] -= base;
  88.          }
  89.          return res;
  90.       }
  91.       return *this - (-v);
  92.    }
  93.    
  94.    bigint operator-(const bigint &v) const {
  95.       if (sign == v.sign) {
  96.          if (abs() >= v.abs()) {
  97.             bigint res = *this;
  98.             for (int i = 0, carry = 0; i < (int) v.a.size() || carry; ++i) {
  99.                res.a[i] -= carry + (i < (int) v.a.size() ? v.a[i] : 0);
  100.                carry = res.a[i] < 0;
  101.                if (carry)
  102.                   res.a[i] += base;
  103.             }
  104.             res.trim();
  105.             return res;
  106.          }
  107.          return -(v - *this);
  108.       }
  109.       return *this + (-v);
  110.    }
  111.    
  112.    void operator*=(int v) {
  113.       if (v < 0)
  114.          sign = -sign, v = -v;
  115.       for (int i = 0, carry = 0; i < (int) a.size() || carry; ++i) {
  116.          if (i == (int) a.size())
  117.             a.push_back(0);
  118.          long long cur = a[i] * (long long) v + carry;
  119.          carry = (int) (cur / base);
  120.          a[i] = (int) (cur % base);
  121.          //asm("divl %%ecx" : "=a"(carry), "=d"(a[i]) : "A"(cur), "c"(base));
  122.       }
  123.       trim();
  124.    }
  125.    
  126.    bigint operator*(int v) const {
  127.       bigint res = *this;
  128.       res *= v;
  129.       return res;
  130.    }
  131.    
  132.    void operator*=(long long v) {
  133.       if (v < 0)
  134.          sign = -sign, v = -v;
  135.       for (int i = 0, carry = 0; i < (int) a.size() || carry; ++i) {
  136.          if (i == (int) a.size())
  137.             a.push_back(0);
  138.          long long cur = a[i] * (long long) v + carry;
  139.          carry = (int) (cur / base);
  140.          a[i] = (int) (cur % base);
  141.          //asm("divl %%ecx" : "=a"(carry), "=d"(a[i]) : "A"(cur), "c"(base));
  142.       }
  143.       trim();
  144.    }
  145.    
  146.    bigint operator*(long long v) const {
  147.       bigint res = *this;
  148.       res *= v;
  149.       return res;
  150.    }
  151.    
  152.    friend pair<bigint, bigint> divmod(const bigint &a1, const bigint &b1) {
  153.       int norm = base / (b1.a.back() + 1);
  154.       bigint a = a1.abs() * norm;
  155.       bigint b = b1.abs() * norm;
  156.       bigint q, r;
  157.       q.a.resize(a.a.size());
  158.      
  159.       for (int i = a.a.size() - 1; i >= 0; i--) {
  160.          r *= base;
  161.          r += a.a[i];
  162.          int s1 = r.a.size() <= b.a.size() ? 0 : r.a[b.a.size()];
  163.          int s2 = r.a.size() <= b.a.size() - 1 ? 0 : r.a[b.a.size() - 1];
  164.          int d = ((long long) base * s1 + s2) / b.a.back();
  165.          r -= b * d;
  166.          while (r < 0)
  167.             r += b, --d;
  168.          q.a[i] = d;
  169.       }
  170.      
  171.       q.sign = a1.sign * b1.sign;
  172.       r.sign = a1.sign;
  173.       q.trim();
  174.       r.trim();
  175.       return make_pair(q, r / norm);
  176.    }
  177.    
  178.    bigint operator/(const bigint &v) const {
  179.       return divmod(*this, v).first;
  180.    }
  181.    
  182.    bigint operator%(const bigint &v) const {
  183.       return divmod(*this, v).second;
  184.    }
  185.    
  186.    void operator/=(int v) {
  187.       if (v < 0)
  188.          sign = -sign, v = -v;
  189.       for (int i = (int) a.size() - 1, rem = 0; i >= 0; --i) {
  190.          long long cur = a[i] + rem * (long long) base;
  191.          a[i] = (int) (cur / v);
  192.          rem = (int) (cur % v);
  193.       }
  194.       trim();
  195.    }
  196.    
  197.    bigint operator/(int v) const {
  198.       bigint res = *this;
  199.       res /= v;
  200.       return res;
  201.    }
  202.    
  203.    int operator%(int v) const {
  204.       if (v < 0)
  205.          v = -v;
  206.       int m = 0;
  207.       for (int i = a.size() - 1; i >= 0; --i)
  208.          m = (a[i] + m * (long long) base) % v;
  209.       return m * sign;
  210.    }
  211.    
  212.    void operator+=(const bigint &v) {
  213.       *this = *this + v;
  214.    }
  215.    void operator-=(const bigint &v) {
  216.       *this = *this - v;
  217.    }
  218.    void operator*=(const bigint &v) {
  219.       *this = *this * v;
  220.    }
  221.    void operator/=(const bigint &v) {
  222.       *this = *this / v;
  223.    }
  224.    
  225.    bool operator<(const bigint &v) const {
  226.       if (sign != v.sign)
  227.          return sign < v.sign;
  228.       if (a.size() != v.a.size())
  229.          return a.size() * sign < v.a.size() * v.sign;
  230.       for (int i = a.size() - 1; i >= 0; i--)
  231.          if (a[i] != v.a[i])
  232.             return a[i] * sign < v.a[i] * sign;
  233.          return false;
  234.    }
  235.    
  236.    bool operator>(const bigint &v) const {
  237.       return v < *this;
  238.    }
  239.    bool operator<=(const bigint &v) const {
  240.       return !(v < *this);
  241.    }
  242.    bool operator>=(const bigint &v) const {
  243.       return !(*this < v);
  244.    }
  245.    bool operator==(const bigint &v) const {
  246.       return !(*this < v) && !(v < *this);
  247.    }
  248.    bool operator!=(const bigint &v) const {
  249.       return *this < v || v < *this;
  250.    }
  251.    
  252.    void trim() {
  253.       while (!a.empty() && !a.back())
  254.          a.pop_back();
  255.       if (a.empty())
  256.          sign = 1;
  257.    }
  258.    
  259.    bool isZero() const {
  260.       return a.empty() || (a.size() == 1 && !a[0]);
  261.    }
  262.    
  263.    bigint operator-() const {
  264.       bigint res = *this;
  265.       res.sign = -sign;
  266.       return res;
  267.    }
  268.    
  269.    bigint abs() const {
  270.       bigint res = *this;
  271.       res.sign *= res.sign;
  272.       return res;
  273.    }
  274.    
  275.    long long longValue() const {
  276.       long long res = 0;
  277.       for (int i = a.size() - 1; i >= 0; i--)
  278.          res = res * base + a[i];
  279.       return res * sign;
  280.    }
  281.    
  282.    friend bigint gcd(const bigint &a, const bigint &b) {
  283.       return b.isZero() ? a : gcd(b, a % b);
  284.    }
  285.    friend bigint lcm(const bigint &a, const bigint &b) {
  286.       return a / gcd(a, b) * b;
  287.    }
  288.    
  289.    void read(const string &s) {
  290.       sign = 1;
  291.       a.clear();
  292.       int pos = 0;
  293.       while (pos < (int) s.size() && (s[pos] == '-' || s[pos] == '+')) {
  294.          if (s[pos] == '-')
  295.             sign = -sign;
  296.          ++pos;
  297.       }
  298.       for (int i = s.size() - 1; i >= pos; i -= base_digits) {
  299.          int x = 0;
  300.          for (int j = max(pos, i - base_digits + 1); j <= i; j++)
  301.             x = x * 10 + s[j] - '0';
  302.          a.push_back(x);
  303.       }
  304.       trim();
  305.    }
  306.    
  307.    friend istream& operator>>(istream &stream, bigint &v) {
  308.       string s;
  309.       stream >> s;
  310.       v.read(s);
  311.       return stream;
  312.    }
  313.    
  314.    friend ostream& operator<<(ostream &stream, const bigint &v) {
  315.       if (v.sign == -1)
  316.          stream << '-';
  317.       stream << (v.a.empty() ? 0 : v.a.back());
  318.       for (int i = (int) v.a.size() - 2; i >= 0; --i)
  319.          stream << setw(base_digits) << setfill('0') << v.a[i];
  320.       return stream;
  321.    }
  322.    
  323.    static vector<int> convert_base(const vector<int> &a, int old_digits, int new_digits) {
  324.       vector<long long> p(max(old_digits, new_digits) + 1);
  325.       p[0] = 1;
  326.       for (int i = 1; i < (int) p.size(); i++)
  327.          p[i] = p[i - 1] * 10;
  328.       vector<int> res;
  329.       long long cur = 0;
  330.       int cur_digits = 0;
  331.       for (int i = 0; i < (int) a.size(); i++) {
  332.          cur += a[i] * p[cur_digits];
  333.          cur_digits += old_digits;
  334.          while (cur_digits >= new_digits) {
  335.             res.push_back(int(cur % p[new_digits]));
  336.             cur /= p[new_digits];
  337.             cur_digits -= new_digits;
  338.          }
  339.       }
  340.       res.push_back((int) cur);
  341.       while (!res.empty() && !res.back())
  342.          res.pop_back();
  343.       return res;
  344.    }
  345.    
  346.    typedef vector<long long> vll;
  347.    
  348.    static vll karatsubaMultiply(const vll &a, const vll &b) {
  349.       int n = a.size();
  350.       vll res(n + n);
  351.       if (n <= 32) {
  352.          for (int i = 0; i < n; i++)
  353.             for (int j = 0; j < n; j++)
  354.                res[i + j] += a[i] * b[j];
  355.             return res;
  356.       }
  357.      
  358.       int k = n >> 1;
  359.       vll a1(a.begin(), a.begin() + k);
  360.       vll a2(a.begin() + k, a.end());
  361.       vll b1(b.begin(), b.begin() + k);
  362.       vll b2(b.begin() + k, b.end());
  363.      
  364.       vll a1b1 = karatsubaMultiply(a1, b1);
  365.       vll a2b2 = karatsubaMultiply(a2, b2);
  366.      
  367.       for (int i = 0; i < k; i++)
  368.          a2[i] += a1[i];
  369.       for (int i = 0; i < k; i++)
  370.          b2[i] += b1[i];
  371.      
  372.       vll r = karatsubaMultiply(a2, b2);
  373.       for (int i = 0; i < (int) a1b1.size(); i++)
  374.          r[i] -= a1b1[i];
  375.       for (int i = 0; i < (int) a2b2.size(); i++)
  376.          r[i] -= a2b2[i];
  377.      
  378.       for (int i = 0; i < (int) r.size(); i++)
  379.          res[i + k] += r[i];
  380.       for (int i = 0; i < (int) a1b1.size(); i++)
  381.          res[i] += a1b1[i];
  382.       for (int i = 0; i < (int) a2b2.size(); i++)
  383.          res[i + n] += a2b2[i];
  384.       return res;
  385.    }
  386.    
  387.    bigint operator*(const bigint &v) const {
  388.       vector<int> a6 = convert_base(this->a, base_digits, 6);
  389.       vector<int> b6 = convert_base(v.a, base_digits, 6);
  390.       vll a(a6.begin(), a6.end());
  391.       vll b(b6.begin(), b6.end());
  392.       while (a.size() < b.size())
  393.          a.push_back(0);
  394.       while (b.size() < a.size())
  395.          b.push_back(0);
  396.       while (a.size() & (a.size() - 1))
  397.          a.push_back(0), b.push_back(0);
  398.       vll c = karatsubaMultiply(a, b);
  399.       bigint res;
  400.       res.sign = sign * v.sign;
  401.       for (int i = 0, carry = 0; i < (int) c.size(); i++) {
  402.          long long cur = c[i] + carry;
  403.          res.a.push_back((int) (cur % 1000000));
  404.          carry = (int) (cur / 1000000);
  405.       }
  406.       res.a = convert_base(res.a, 6, base_digits);
  407.       res.trim();
  408.       return res;
  409.    }
  410. };
  411.  
  412. void preproc() { }
  413.  
  414. void solve()
  415. {
  416.    int n;
  417.    cin >> n;
  418.  
  419.    bigint dp[3*n+1][n+1][n+1][n+1][3];
  420.    // dp[steps][x][y][z][last]
  421.  
  422.    dp[1][1][0][0][0] = 1;
  423.  
  424.    for (int steps = 1; steps <= 3*n; ++steps)
  425.       for (int x = 0; x <= n; ++x)
  426.          for (int y = 0; y <= n; ++y)
  427.             for (int z = 0; z <= n; ++z)
  428.                for (int last = 0; last <= 2; ++last)
  429.                   if ( dp[steps][x][y][z][last] != 0 )
  430.                      for (int j = 1; j <= 2; ++j) {
  431.                         int next = (last + j) % 3;
  432.                         int xx = (x + (next == 0));
  433.                         int yy = (y + (next == 1));
  434.                         int zz = (z + (next == 2));
  435.                         if (xx > n or yy > n or zz > n)
  436.                            continue;
  437.                         dp[steps+1][xx][yy][zz][next] +=
  438.                         dp[steps][x][y][z][last];
  439.                         debug(xx, yy, zz, dp[steps+1][xx][yy][zz][next] );
  440.                      }
  441.                      
  442.    bigint n_fac = 1;
  443.    for (int i = 2; i <= n; ++i)
  444.       n_fac *= i;
  445.    
  446.    bigint perm = n_fac * n_fac * n_fac;
  447.    // HOW TO GET THE RESULT ? COMBINATORICS STUFF
  448.    cout << (dp[3*n][n][n][n][1])*perm / 2 << '\n';
  449. }
  450.  
  451. signed main()
  452. {
  453.    IOS; PREC;
  454.    preproc();
  455.  
  456.    int tc = 1;
  457.    // cin >> tc;
  458.    for (int Tt = 1; Tt <= tc; ++Tt) {
  459.       // debug(Tt);
  460.       // cout << "Case #" << Tt << ": ";
  461.       solve();
  462.    }
  463.    return EXIT_SUCCESS;
  464. }
  465.  
  466.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement