Advertisement
Guest User

Untitled

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