Advertisement
Saleh127

UVA 10814

Nov 14th, 2020
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.60 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int MAXD = 10000, DIG = 9, BASE = 1000000000;
  5.  
  6. const unsigned long long BOUND = numeric_limits <unsigned long long> :: max () - (unsigned long long) BASE * BASE;
  7.  
  8. class BigInteger{
  9. private:
  10. int digits[MAXD];
  11. int D;
  12. public:
  13.  
  14. friend ostream &operator<<(ostream &out,BigInteger &c);
  15.  
  16. inline void trim()
  17. {
  18. while(D > 1 && digits[D-1] == 0 )
  19. D--;
  20. }
  21.  
  22. inline void dealint(long long x)
  23. {
  24. memset(digits,0,sizeof(digits));
  25. D = 0;
  26. do{
  27. digits[D++] = x % BASE;
  28. x /= BASE;
  29. }while(x > 0);
  30. }
  31.  
  32. inline void dealstr(char *s)
  33. {
  34. memset(digits,0,sizeof(digits));
  35. int len = strlen(s),first = (len + DIG -1)%DIG + 1;
  36.  
  37. D = (len+DIG-1)/DIG;
  38.  
  39. for(int i = 0;i < first;i++)
  40. digits[D-1] = digits[D-1]*10 + s[i] - '0';
  41.  
  42. for(int i = first, d = D-2; i < len;i+=DIG,d--)
  43. for(int j = i;j < i+DIG;j++)
  44. digits[d] = digits[d]*10 + s[j]-'0';
  45.  
  46. trim();
  47. }
  48.  
  49. inline char *print()
  50. {
  51. trim();
  52.  
  53. char *cdigits = new char[DIG * D + 1];
  54.  
  55. int pos = 0,d = digits[D-1];
  56.  
  57. do{
  58. cdigits[pos++] = d % 10 + '0';
  59. d/=10;
  60. }while(d > 0);
  61.  
  62. reverse(cdigits,cdigits+pos);
  63.  
  64. for(int i = D - 2;i >= 0;i--,pos += DIG)
  65. for(int j = DIG-1,t = digits[i];j >= 0;j--)
  66. {
  67. cdigits[pos+j] = t%10 + '0';
  68. t /= 10;
  69. }
  70.  
  71. cdigits[pos] = '\0';
  72.  
  73. return cdigits;
  74. }
  75.  
  76.  
  77. BigInteger(){dealint(0);}
  78.  
  79. BigInteger(long long x){
  80. dealint(x);
  81. }
  82.  
  83. BigInteger(int x){
  84. dealint(x);
  85. }
  86.  
  87. BigInteger(char *s){
  88. dealstr(s);
  89. }
  90.  
  91.  
  92.  
  93. inline bool operator < (const BigInteger &o) const
  94. {
  95. if(D != o.D)
  96. return D < o.D;
  97.  
  98. for(int i = D-1;i>=0;i--)
  99. if(digits[i] != o.digits[i])
  100. return digits[i] < o.digits[i];
  101. return false; //equal
  102.  
  103. }
  104.  
  105. bool operator > (const BigInteger & o)const {return o < *this;}
  106. bool operator <= (const BigInteger & o)const {return !(o < *this);}
  107. bool operator >= (const BigInteger & o)const {return !(*this < o);}
  108. bool operator != (const BigInteger & o)const {return o < *this || *this < o;}
  109. bool operator == (const BigInteger & o)const {return !(o < *this) && !(*this < o);}
  110.  
  111.  
  112. BigInteger &operator++()
  113. {
  114. *this = *this + 1;
  115. return *this;
  116. }
  117.  
  118.  
  119. BigInteger operator ++(int)
  120. {
  121. BigInteger old = *this;
  122. ++(*this);
  123. return old;
  124. }
  125.  
  126. inline BigInteger operator << (int p) const
  127. {
  128. BigInteger temp;
  129. temp.D = D + p;
  130.  
  131. for (int i = 0; i < D; i++)
  132. temp.digits [i + p] = digits [i];
  133.  
  134. for (int i = 0; i < p; i++)
  135. temp.digits [i] = 0;
  136.  
  137. return temp;
  138. }
  139.  
  140. inline BigInteger operator >> (int p) const
  141. {
  142. BigInteger temp;
  143. temp.D = D - p;
  144.  
  145. for (int i = 0; i < D - p; i++)
  146. temp.digits [i] = digits [i + p];
  147.  
  148. for (int i = D - p; i < D; i++)
  149. temp.digits [i] = 0;
  150.  
  151. return temp;
  152. }
  153.  
  154.  
  155. BigInteger &operator += (const BigInteger &b)
  156. {
  157. *this = *this + b;
  158. return *this;
  159. }
  160.  
  161. BigInteger &operator -= (const BigInteger &b)
  162. {
  163. *this = *this - b;
  164. return *this;
  165. }
  166.  
  167. BigInteger &operator *= (const BigInteger &b)
  168. {
  169. *this = *this * b;
  170. return *this;
  171. }
  172.  
  173. BigInteger &operator /= (const BigInteger &b)
  174. {
  175. *this = *this / b;
  176. return *this;
  177. }
  178.  
  179. BigInteger &operator %= (const BigInteger &b)
  180. {
  181. *this = *this % b;
  182. return *this;
  183. }
  184.  
  185. inline BigInteger operator + (const BigInteger &o) const
  186. {
  187. BigInteger sum = o;
  188. int carry = 0;
  189.  
  190. for (sum.D = 0; sum.D < D || carry > 0; sum.D++)
  191. {
  192. sum.digits [sum.D] += (sum.D < D ? digits [sum.D] : 0) + carry;
  193.  
  194. if (sum.digits [sum.D] >= BASE)
  195. {
  196. sum.digits [sum.D] -= BASE;
  197. carry = 1;
  198. }
  199. else
  200. carry = 0;
  201. }
  202.  
  203. sum.D = max (sum.D, o.D);
  204. sum.trim ();
  205. return sum;
  206. }
  207. inline BigInteger operator - (const BigInteger &o) const
  208. {
  209. BigInteger diff = *this;
  210.  
  211. for (int i = 0, carry = 0; i < o.D || carry > 0; i++)
  212. {
  213. diff.digits [i] -= (i < o.D ? o.digits [i] : 0) + carry;
  214.  
  215. if (diff.digits [i] < 0)
  216. {
  217. diff.digits [i] += BASE;
  218. carry = 1;
  219. }
  220. else
  221. carry = 0;
  222. }
  223.  
  224. diff.trim ();
  225. return diff;
  226. }
  227. inline BigInteger operator * (const BigInteger &o) const
  228. {
  229. BigInteger prod = 0;
  230. unsigned long long sum = 0, carry = 0;
  231.  
  232. for (prod.D = 0; prod.D < D + o.D - 1 || carry > 0; prod.D++)
  233. {
  234. sum = carry % BASE;
  235. carry /= BASE;
  236.  
  237. for (int j = max (prod.D - o.D + 1, 0); j <= min (D - 1, prod.D); j++)
  238. {
  239. sum += (unsigned long long) digits [j] * o.digits [prod.D - j];
  240.  
  241. if (sum >= BOUND)
  242. {
  243. carry += sum / BASE;
  244. sum %= BASE;
  245. }
  246. }
  247.  
  248. carry += sum / BASE;
  249. prod.digits [prod.D] = sum % BASE;
  250. }
  251.  
  252. prod.trim ();
  253. return prod;
  254. }
  255. inline BigInteger range (int a, int b) const
  256. {
  257. BigInteger temp = 0;
  258. temp.D = b - a;
  259.  
  260. for (int i = 0; i < temp.D; i++)
  261. temp.digits [i] = digits [i + a];
  262.  
  263. return temp;
  264. }
  265.  
  266.  
  267. inline double double_div (const BigInteger &o) const
  268. {
  269. double val = 0, oval = 0;
  270. int num = 0, onum = 0;
  271.  
  272. for (int i = D - 1; i >= max (D - 3, 0); i--, num++)
  273. val = val * BASE + digits [i];
  274.  
  275. for (int i = o.D - 1; i >= max (o.D - 3, 0); i--, onum++)
  276. oval = oval * BASE + o.digits [i];
  277.  
  278. return val / oval * (D - num > o.D - onum ? BASE : 1);
  279. }
  280.  
  281. inline pair <BigInteger, BigInteger> divmod (const BigInteger &o) const
  282. {
  283. BigInteger quot = 0, rem = *this, temp;
  284.  
  285. for (int i = D - o.D; i >= 0; i--)
  286. {
  287. temp = rem.range (i, rem.D);
  288. int div = (int) temp.double_div (o);
  289. BigInteger mult = o * div;
  290.  
  291. while (div > 0 && temp < mult)
  292. {
  293. mult = mult - o;
  294. div--;
  295. }
  296.  
  297. while (div + 1 < BASE && !(temp < mult + o))
  298. {
  299. mult = mult + o;
  300. div++;
  301. }
  302.  
  303. rem = rem - (o * div << i);
  304.  
  305. if (div > 0)
  306. {
  307. quot.digits [i] = div;
  308. quot.D = max (quot.D, i + 1);
  309. }
  310. }
  311.  
  312. quot.trim ();
  313. rem.trim ();
  314. return make_pair (quot, rem);
  315. }
  316.  
  317. inline BigInteger operator / (const BigInteger &o) const
  318. {
  319. return divmod (o).first;
  320. }
  321.  
  322. inline BigInteger operator % (const BigInteger &o) const
  323. {
  324. return divmod (o).second;
  325. }
  326.  
  327.  
  328. inline BigInteger power (int exp) const
  329. {
  330. BigInteger p = 1, temp = *this;
  331.  
  332. while (exp > 0)
  333. {
  334. if (exp & 1) p = p * temp;
  335. if (exp > 1) temp = temp * temp;
  336. exp >>= 1;
  337. }
  338.  
  339. return p;
  340. }
  341.  
  342. inline BigInteger factorial() const
  343. {
  344. BigInteger ans = 1, num = *this;
  345.  
  346. if (num == 0 || num == 1)
  347. return ans;
  348. while (!(num < 0 || num == 0)) {
  349. ans = ans * num;
  350. num = num - 1;
  351. }
  352. return ans;
  353. }
  354. };
  355.  
  356. ostream &operator<<(ostream &out, BigInteger &c){
  357. out<<c.print();
  358. return out;
  359. }
  360.  
  361. istream &operator >> (istream &in,BigInteger &c)
  362. {
  363. char s[10000];
  364. in>>s;
  365. c = s;
  366. return in;
  367. }
  368. BigInteger gcd(BigInteger a,BigInteger b)
  369. {
  370. if (b==0) return a;
  371. return gcd(b, a%b);
  372. }
  373. BigInteger a,b,c;
  374. int main()
  375. {
  376. char k;
  377. int tt;
  378. cin>>tt;
  379. while(tt--)
  380. {
  381. cin>>a>>k>>b;
  382. BigInteger p=gcd(a,b);
  383. a/=p,b/=p;
  384. cout<<a<<' '<<'/'<<' '<<b<<endl;
  385. }
  386. return 0;
  387. }
  388.  
  389.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement