Advertisement
Guest User

lol

a guest
Sep 22nd, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.70 KB | None | 0 0
  1. using namespace std ;
  2.  
  3. typedef int64_t ll;
  4. typedef long long ll;
  5. typedef pair<ll, ll> lll;
  6. typedef pair<ll, int> lli;
  7. typedef pair<int, int> ii;
  8.  
  9. #define EL printf("\n")
  10. #define OK printf("OK")
  11. #define pb push_back
  12. #define mp make_pair
  13. #define ep emplace_back
  14. #define X  first
  15. #define Y  second
  16. #define fillchar(a,x) memset(a, x, sizeof(a))
  17. #define FOR(i,l,r) for (int i=l;i<=r;i++)
  18. #define FORD(i,r,l) for (int i=r;i>=l;i--)
  19.  
  20. const int base = 1e9;
  21. typedef vector<int> BigInt;
  22.  
  23. void Set(BigInt &a) {
  24.     while (a.size() > 1 && a.back() == 0) a.pop_back();
  25. }
  26.  
  27. BigInt Integer(string s) {
  28.     BigInt ans;
  29.     if (s[0] == '-') return ans;
  30.     if (s.size() == 0) {
  31.         ans.pb(0);
  32.         return ans;
  33.     }
  34.     while (s.size() % 9 != 0) s = '0' + s;
  35.     for (int i = 0; i < s.size(); i += 9) {
  36.         int v = 0;
  37.         for (int j = i; j < i + 9; j++) v = v * 10 + (s[j] - '0');
  38.         ans.insert(ans.begin(), v);
  39.     }
  40.     Set(ans);
  41.     return ans;
  42. }
  43.  
  44. BigInt Integer(char c[]) {
  45.     string s = "";
  46.     FOR(i, 0, strlen(c) - 1) s = s + c[i];
  47.     return Integer(s);
  48. }
  49.  
  50. BigInt Integer(ll x) {
  51.     string s = "";
  52.     while (x > 0) s = char(x % 10 + '0') + s, x /= 10;
  53.     return Integer(s);
  54. }
  55.  
  56. BigInt Integer(int x) {
  57.     return Integer((ll) x);
  58. }
  59.  
  60.  
  61.  
  62.  
  63. istream & operator >> (istream &in, BigInt &a) {
  64.     char ch[10001];
  65.     in >> ch;
  66.     a = Integer(ch);
  67.     return in;
  68. }
  69.  
  70.  
  71. ostream & operator << (ostream &out, BigInt a) {
  72.     Set(a);
  73.     out << ((a.size() == 0) ? 0 : a.back());
  74.     FORD(i, a.size() - 2, 0) out << setfill('0') << setw(9) << a[i];
  75.     return out;
  76. }
  77.  
  78.  
  79.  
  80.  
  81. bool operator < (BigInt a, BigInt b) {
  82.     Set(a);
  83.     Set(b);
  84.     if (a.size() != b.size()) return (a.size() < b.size());
  85.     FORD(i, a.size() - 1, 0)
  86.     if (a[i] != b[i]) return (a[i] < b[i]);
  87.     return false;
  88. }
  89.  
  90. bool operator > (BigInt a, BigInt b) {
  91.     return (b < a);
  92. }
  93.  
  94. bool operator == (BigInt a, BigInt b) {
  95.     return (!(a < b) && !(b < a));
  96. }
  97.  
  98. bool operator <= (BigInt a, BigInt b) {
  99.     return (a < b || a == b);
  100. }
  101.  
  102. bool operator >= (BigInt a, BigInt b) {
  103.     return (b < a || b == a);
  104. }
  105.  
  106. bool operator < (BigInt a, int b) {
  107.     return (a < Integer(b));
  108. }
  109.  
  110. bool operator > (BigInt a, int b) {
  111.     return (a > Integer(b));
  112. }
  113.  
  114. bool operator == (BigInt a, int b) {
  115.     return (a == Integer(b));
  116. }
  117.  
  118. bool operator >= (BigInt a, int b) {
  119.     return (a >= Integer(b));
  120. }
  121.  
  122. bool operator <= (BigInt a, int b) {
  123.     return (a <= Integer(b));
  124. }
  125.  
  126.  
  127.  
  128. BigInt max(BigInt a, BigInt b) {
  129.     if (a > b) return a;
  130.     return b;
  131. }
  132.  
  133. BigInt min(BigInt a, BigInt b) {
  134.     if (a < b) return a;
  135.     return b;
  136. }
  137.  
  138.  
  139.  
  140.  
  141. BigInt operator + (BigInt a, BigInt b) {
  142.     Set(a);
  143.     Set(b);
  144.     BigInt ans;
  145.     int carry = 0;
  146.     FOR(i, 0, max(a.size(), b.size()) - 1) {
  147.         if (i < a.size()) carry += a[i];
  148.         if (i < b.size()) carry += b[i];
  149.         ans.pb(carry % base);
  150.         carry /= base;
  151.     }
  152.     if (carry) ans.pb(carry);
  153.     Set(ans);
  154.     return ans;
  155. }
  156.  
  157. BigInt operator + (BigInt a, int b) {
  158.     return a + Integer(b);
  159. }
  160.  
  161. BigInt operator ++ (BigInt &a) { // ++a
  162.     a = a + 1;
  163.     return a;
  164. }
  165.  
  166. void operator += (BigInt &a, BigInt b) {
  167.     a = a + b;
  168. }
  169.  
  170. void operator += (BigInt &a, int b) {
  171.     a = a + b;
  172. }
  173.  
  174.  
  175.  
  176.  
  177. BigInt operator - (BigInt a, BigInt b) {
  178.     Set(a);
  179.     Set(b);
  180.     BigInt ans;
  181.     int carry = 0;
  182.     FOR(i, 0, a.size() - 1) {
  183.         carry += a[i] - (i < b.size() ? b[i] : 0);
  184.         if (carry < 0) ans.pb(carry + base), carry = -1;
  185.         else ans.pb(carry), carry = 0;
  186.     }
  187.     Set(ans);
  188.     return ans;
  189. }
  190.  
  191. BigInt operator - (BigInt a, int b) {
  192.     return a - Integer(b);
  193. }
  194.  
  195. void operator -- (BigInt &a) { // --a
  196.     a = a - 1;
  197. }
  198.  
  199. void operator -= (BigInt &a, BigInt b) {
  200.     a = a + b;
  201. }
  202.  
  203. void operator -= (BigInt &a, int b) {
  204.     a = a - b;
  205. }
  206.  
  207.  
  208.  
  209.  
  210. BigInt operator * (BigInt a, BigInt b) {
  211.     Set(a);
  212.     Set(b);
  213.     BigInt ans;
  214.     ans.assign(a.size() + b.size(), 0);
  215.     FOR(i, 0, a.size() - 1) {
  216.         ll carry = 0ll;
  217.         for (int j = 0; j < b.size() || carry > 0; j++) {
  218.             ll s = ans[i + j] + carry + (ll)a[i] * (j < b.size() ? (ll)b[j] : 0ll);
  219.             ans[i + j] = s % base;
  220.             carry = s / base;
  221.         }
  222.     }
  223.     Set(ans);
  224.     return ans;
  225. }
  226.  
  227. BigInt operator * (BigInt a, int b) {
  228.     return a * Integer(b);
  229. }
  230.  
  231. void operator *= (BigInt &a, BigInt b) {
  232.     a = a * b;
  233. }
  234.  
  235. void operator *= (BigInt &a, int b) {
  236.     a = a * b;
  237. }
  238.  
  239.  
  240.  
  241. BigInt operator / (BigInt a, BigInt b) {
  242.     Set(a);
  243.     Set(b);
  244.     if (b == Integer(0)) return Integer("-1");
  245.     BigInt ans, cur;
  246.     FORD(i, a.size() - 1, 0) {
  247.         cur.insert(cur.begin(), a[i]);
  248.         int x = 0, L = 0, R = base;
  249.         while (L <= R) {
  250.             int mid = (L + R) >> 1;
  251.             if (b * Integer(mid) > cur) {
  252.                 x = mid;
  253.                 R = mid - 1;
  254.             } else
  255.                 L = mid + 1;
  256.         }
  257.         cur = cur - Integer(x - 1) * b;
  258.         ans.insert(ans.begin(), x - 1);
  259.     }
  260.     Set(ans);
  261.     return ans;
  262. }
  263.  
  264. BigInt operator / (BigInt a, int b) {
  265.     Set(a);
  266.     BigInt ans;
  267.     ll cur = 0ll;
  268.     FORD(i, a.size() - 1, 0) {
  269.         cur = (cur * (ll)base + (ll)a[i]);
  270.         ans.insert(ans.begin(), cur / b);
  271.         cur %= b;
  272.     }
  273.     Set(ans);
  274.     return ans;
  275. }
  276.  
  277. void operator /= (BigInt &a, BigInt b) {
  278.     a = a / b;
  279. }
  280.  
  281. void operator /= (BigInt &a, int b) {
  282.     a = a / b;
  283. }
  284.  
  285.  
  286.  
  287. BigInt operator % (BigInt a, BigInt b) {
  288.     Set(a);
  289.     Set(b);
  290.     if (b == Integer(0)) return Integer("-1");
  291.     BigInt ans;
  292.     FORD(i, a.size() - 1, 0) {
  293.         ans.insert(ans.begin(), a[i]);
  294.         int x = 0, L = 0, R = base;
  295.         while (L <= R) {
  296.             int mid = (L + R) >> 1;
  297.             if (b * Integer(mid) > ans) {
  298.                 x = mid;
  299.                 R = mid - 1;
  300.             } else
  301.                 L = mid + 1;
  302.         }
  303.         ans = ans - Integer(x - 1) * b;
  304.     }
  305.     Set(ans);
  306.     return ans;
  307. }
  308.  
  309. BigInt operator % (BigInt a, int b) {
  310.     Set(a);
  311.     if (b == 0) return Integer(-1);
  312.     return a - (a / b) * b;
  313. }
  314.  
  315. void operator %= (BigInt &a, BigInt b) {
  316.     a = a % b;
  317. }
  318.  
  319. void operator %= (BigInt &a, int b) {
  320.     a = a % Integer(b);
  321. }
  322.  
  323. BigInt gcd(BigInt a, BigInt b) {
  324.     Set(a);
  325.     Set(b);
  326.     while (b > Integer(0)) {
  327.         BigInt r = a % b;
  328.         a = b;
  329.         b = r;
  330.     }
  331.     Set(a);
  332.     return a;
  333. }
  334.  
  335. BigInt lcm(BigInt a, BigInt b) {
  336.     return (a * b / gcd(a, b));
  337. }
  338.  
  339.  
  340. BigInt sqrt(BigInt a) {
  341.     BigInt x0 = a, x1 = (a + 1) / 2;
  342.     while (x1 < x0) {
  343.         x0 = x1;
  344.         x1 = (x1 + a / x1) / 2;
  345.     }
  346.     return x0;
  347. }
  348.  
  349.  
  350. BigInt pow(BigInt a, BigInt b) {
  351.     if (b == Integer(0)) return Integer(1);
  352.     BigInt tmp = pow(a, b / 2);
  353.     if (b % 2 == 0) return tmp * tmp;
  354.     return tmp * tmp * a;
  355. }
  356.  
  357.  
  358. BigInt pow(BigInt a, int b) {
  359.     return pow(a, (Integer(b)));
  360. }
  361.  
  362.  
  363. int log(int n, BigInt a) {
  364.     Set(a);
  365.     int ans = 0;
  366.     while (a > Integer(1)) {
  367.         ans++;
  368.         a /= n;
  369.     }
  370.     return ans;
  371. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement