Cod sursa(job #2446792)

Utilizator ApostolIlieDanielApostol Daniel ApostolIlieDaniel Data 10 august 2019 18:48:01
Problema Patrate2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.73 kb
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

#define pb push_back


const ll base = 1e15;

struct Huge {
  vector <ll> v;
  Huge(int a = 0) {
    while(0 < a){
      v.pb (a % base);
      a /= base;
    }
    if(v.size () == 0)
      v.pb (0);
  }
  Huge operator + (Huge const &a) const{
    Huge result;
    result.v.resize (max (v.size (), a.v.size ()) + 1, 0);
    for(int i = 0; i < result.v.size () - 1; i++) {
      if(i < v.size ())
        result.v[i] += v[i];
      if(i < a.v.size ())
        result.v[i] += a.v[i];

      if(base <= result.v[i]) {
        result.v[i + 1] = result.v[i] / base;
        result.v[i] %= base;
      }
    }

    while(0 < result.v.size () && result.v.back () == 0)
      result.v.pop_back ();

    return result;
  }
  Huge operator - (Huge const &a) const{
    Huge result;
    result.v.resize (max (v.size (), a.v.size ()) + 1, 0);
    for (int i = 0; i < result.v.size () - 1; i++) {
      if (i < v.size ())
        result.v[i] += v[i];
      if (i < a.v.size ())
        result.v[i] -= a.v[i];

      if (result.v[i] < 0) {
        result.v[i + 1]--;
        result.v[i] += base;
      }
    }

    while (0 < result.v.size () && result.v.back () == 0)
      result.v.pop_back ();

    return result;
  }
  void print () {
    int k = v.size () - 1;
    bool ok = 0;
    if ((k == 0 && v[0] == 0) || k == -1) {
        cout << "0\n";
      return;
    }
    while (0 <= k){
      for (ll i = base / 10; 1 <= i; i /= 10) {
        if (0 < v[k] / i % 10)
          ok = 1;

        if (ok == 1)
            cout << v[k] / i % 10;
      }
      k--;
    }
    cout << "\n";
  }
  bool operator < (Huge const &a) {
      if (a.v.size () != v.size ())
        return v.size () < a.v.size ();
      for (int i = v.size () - 1; i >= 0; i--)
        if (a.v[i] != v[i])
            return v[i] < a.v[i];
  }
  Huge operator * (int const &a) {
      Huge result;
      result.v.resize (v.size () + 1);
      for (int i = 0; i < v.size (); i++) {
        result.v[i] += v[i] * a;
        result.v[i + 1] = result.v[i] / base;
        result.v[i] %= base;
      }
      while (result.v.back () >= base) {
        ll t = result.v.back () / base;
        result.v[v.size () - 1] %= base;
        result.v.pb (t);
      }
      while (result.v.back () == 0)
        result.v.pop_back ();
      return result;
  }
};

int main() {
    int n;
    freopen ("patrate2.in", "r", stdin);
    freopen ("patrate2.out", "w", stdout);
    cin >> n;
    Huge ans (1);
    for (int i = 1; i <= n; i++)
        ans = ans * (i * 2);
    for (int i = 1; i <= n * n - n; i++)
        ans = ans * 2;
    ans.print ();
    return 0;
}