Advertisement
jeff69

Untitled

Oct 8th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.16 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int base = 1000000000;
  5. const int base_digits = 9;
  6.  
  7. struct bigint {
  8. vector<int> a;
  9. int sign;
  10.  
  11. bigint() :
  12. sign(1) {
  13. }
  14.  
  15. bigint(long long v) {
  16. *this = v;
  17. }
  18.  
  19. bigint(const string &s) {
  20. read(s);
  21. }
  22.  
  23. void operator=(const bigint &v) {
  24. sign = v.sign;
  25. a = v.a;
  26. }
  27.  
  28. void operator=(long long v) {
  29. sign = 1;
  30. if (v < 0)
  31. sign = -1, v = -v;
  32. for (; v > 0; v = v / base)
  33. a.push_back(v % base);
  34. }
  35.  
  36. bigint operator+(const bigint &v) const {
  37. if (sign == v.sign) {
  38. bigint res = v;
  39.  
  40. for (int i = 0, carry = 0; i < (int) max(a.size(), v.a.size()) || carry; ++i) {
  41. if (i == (int) res.a.size())
  42. res.a.push_back(0);
  43. res.a[i] += carry + (i < (int) a.size() ? a[i] : 0);
  44. carry = res.a[i] >= base;
  45. if (carry)
  46. res.a[i] -= base;
  47. }
  48. return res;
  49. }
  50. return *this - (-v);
  51. }
  52.  
  53. bigint operator-(const bigint &v) const {
  54. if (sign == v.sign) {
  55. if (abs() >= v.abs()) {
  56. bigint res = *this;
  57. for (int i = 0, carry = 0; i < (int) v.a.size() || carry; ++i) {
  58. res.a[i] -= carry + (i < (int) v.a.size() ? v.a[i] : 0);
  59. carry = res.a[i] < 0;
  60. if (carry)
  61. res.a[i] += base;
  62. }
  63. res.trim();
  64. return res;
  65. }
  66. return -(v - *this);
  67. }
  68. return *this + (-v);
  69. }
  70.  
  71. void operator*=(int v) {
  72. if (v < 0)
  73. sign = -sign, v = -v;
  74. for (int i = 0, carry = 0; i < (int) a.size() || carry; ++i) {
  75. if (i == (int) a.size())
  76. a.push_back(0);
  77. long long cur = a[i] * (long long) v + carry;
  78. carry = (int) (cur / base);
  79. a[i] = (int) (cur % base);
  80. //asm("divl %%ecx" : "=a"(carry), "=d"(a[i]) : "A"(cur), "c"(base));
  81. }
  82. trim();
  83. }
  84.  
  85. bigint operator*(int v) const {
  86. bigint res = *this;
  87. res *= v;
  88. return res;
  89. }
  90.  
  91. friend pair<bigint, bigint> divmod(const bigint &a1, const bigint &b1) {
  92. int norm = base / (b1.a.back() + 1);
  93. bigint a = a1.abs() * norm;
  94. bigint b = b1.abs() * norm;
  95. bigint q, r;
  96. q.a.resize(a.a.size());
  97.  
  98. for (int i = a.a.size() - 1; i >= 0; i--) {
  99. r *= base;
  100. r += a.a[i];
  101. int s1 = r.a.size() <= b.a.size() ? 0 : r.a[b.a.size()];
  102. int s2 = r.a.size() <= b.a.size() - 1 ? 0 : r.a[b.a.size() - 1];
  103. int d = ((long long) base * s1 + s2) / b.a.back();
  104. r -= b * d;
  105. while (r < 0)
  106. r += b, --d;
  107. q.a[i] = d;
  108. }
  109.  
  110. q.sign = a1.sign * b1.sign;
  111. r.sign = a1.sign;
  112. q.trim();
  113. r.trim();
  114. return make_pair(q, r / norm);
  115. }
  116.  
  117. bigint operator/(const bigint &v) const {
  118. return divmod(*this, v).first;
  119. }
  120.  
  121. bigint operator%(const bigint &v) const {
  122. return divmod(*this, v).second;
  123. }
  124.  
  125. void operator/=(int v) {
  126. if (v < 0)
  127. sign = -sign, v = -v;
  128. for (int i = (int) a.size() - 1, rem = 0; i >= 0; --i) {
  129. long long cur = a[i] + rem * (long long) base;
  130. a[i] = (int) (cur / v);
  131. rem = (int) (cur % v);
  132. }
  133. trim();
  134. }
  135.  
  136. bigint operator/(int v) const {
  137. bigint res = *this;
  138. res /= v;
  139. return res;
  140. }
  141.  
  142. int operator%(int v) const {
  143. if (v < 0)
  144. v = -v;
  145. int m = 0;
  146. for (int i = a.size() - 1; i >= 0; --i)
  147. m = (a[i] + m * (long long) base) % v;
  148. return m * sign;
  149. }
  150.  
  151. void operator+=(const bigint &v) {
  152. *this = *this + v;
  153. }
  154. void operator-=(const bigint &v) {
  155. *this = *this - v;
  156. }
  157. void operator*=(const bigint &v) {
  158. *this = *this * v;
  159. }
  160. void operator/=(const bigint &v) {
  161. *this = *this / v;
  162. }
  163.  
  164. bool operator<(const bigint &v) const {
  165. if (sign != v.sign)
  166. return sign < v.sign;
  167. if (a.size() != v.a.size())
  168. return a.size() * sign < v.a.size() * v.sign;
  169. for (int i = a.size() - 1; i >= 0; i--)
  170. if (a[i] != v.a[i])
  171. return a[i] * sign < v.a[i] * sign;
  172. return false;
  173. }
  174.  
  175. bool operator>(const bigint &v) const {
  176. return v < *this;
  177. }
  178. bool operator<=(const bigint &v) const {
  179. return !(v < *this);
  180. }
  181. bool operator>=(const bigint &v) const {
  182. return !(*this < v);
  183. }
  184. bool operator==(const bigint &v) const {
  185. return !(*this < v) && !(v < *this);
  186. }
  187. bool operator!=(const bigint &v) const {
  188. return *this < v || v < *this;
  189. }
  190.  
  191. void trim() {
  192. while (!a.empty() && !a.back())
  193. a.pop_back();
  194. if (a.empty())
  195. sign = 1;
  196. }
  197.  
  198. bool isZero() const {
  199. return a.empty() || (a.size() == 1 && !a[0]);
  200. }
  201.  
  202. bigint operator-() const {
  203. bigint res = *this;
  204. res.sign = -sign;
  205. return res;
  206. }
  207.  
  208. bigint abs() const {
  209. bigint res = *this;
  210. res.sign *= res.sign;
  211. return res;
  212. }
  213.  
  214. long long longValue() const {
  215. long long res = 0;
  216. for (int i = a.size() - 1; i >= 0; i--)
  217. res = res * base + a[i];
  218. return res * sign;
  219. }
  220.  
  221. friend bigint gcd(const bigint &a, const bigint &b) {
  222. return b.isZero() ? a : gcd(b, a % b);
  223. }
  224. friend bigint lcm(const bigint &a, const bigint &b) {
  225. return a / gcd(a, b) * b;
  226. }
  227.  
  228. void read(const string &s) {
  229. sign = 1;
  230. a.clear();
  231. int pos = 0;
  232. while (pos < (int) s.size() && (s[pos] == '-' || s[pos] == '+')) {
  233. if (s[pos] == '-')
  234. sign = -sign;
  235. ++pos;
  236. }
  237. for (int i = s.size() - 1; i >= pos; i -= base_digits) {
  238. int x = 0;
  239. for (int j = max(pos, i - base_digits + 1); j <= i; j++)
  240. x = x * 10 + s[j] - '0';
  241. a.push_back(x);
  242. }
  243. trim();
  244. }
  245.  
  246. friend istream& operator>>(istream &stream, bigint &v) {
  247. string s;
  248. stream >> s;
  249. v.read(s);
  250. return stream;
  251. }
  252.  
  253. friend ostream& operator<<(ostream &stream, const bigint &v) {
  254. if (v.sign == -1)
  255. stream << '-';
  256. stream << (v.a.empty() ? 0 : v.a.back());
  257. for (int i = (int) v.a.size() - 2; i >= 0; --i)
  258. stream << setw(base_digits) << setfill('0') << v.a[i];
  259. return stream;
  260. }
  261.  
  262. static vector<int> convert_base(const vector<int> &a, int old_digits, int new_digits) {
  263. vector<long long> p(max(old_digits, new_digits) + 1);
  264. p[0] = 1;
  265. for (int i = 1; i < (int) p.size(); i++)
  266. p[i] = p[i - 1] * 10;
  267. vector<int> res;
  268. long long cur = 0;
  269. int cur_digits = 0;
  270. for (int i = 0; i < (int) a.size(); i++) {
  271. cur += a[i] * p[cur_digits];
  272. cur_digits += old_digits;
  273. while (cur_digits >= new_digits) {
  274. res.push_back(int(cur % p[new_digits]));
  275. cur /= p[new_digits];
  276. cur_digits -= new_digits;
  277. }
  278. }
  279. res.push_back((int) cur);
  280. while (!res.empty() && !res.back())
  281. res.pop_back();
  282. return res;
  283. }
  284.  
  285. typedef vector<long long> vll;
  286.  
  287. static vll karatsubaMultiply(const vll &a, const vll &b) {
  288. int n = a.size();
  289. vll res(n + n);
  290. if (n <= 32) {
  291. for (int i = 0; i < n; i++)
  292. for (int j = 0; j < n; j++)
  293. res[i + j] += a[i] * b[j];
  294. return res;
  295. }
  296.  
  297. int k = n >> 1;
  298. vll a1(a.begin(), a.begin() + k);
  299. vll a2(a.begin() + k, a.end());
  300. vll b1(b.begin(), b.begin() + k);
  301. vll b2(b.begin() + k, b.end());
  302.  
  303. vll a1b1 = karatsubaMultiply(a1, b1);
  304. vll a2b2 = karatsubaMultiply(a2, b2);
  305.  
  306. for (int i = 0; i < k; i++)
  307. a2[i] += a1[i];
  308. for (int i = 0; i < k; i++)
  309. b2[i] += b1[i];
  310.  
  311. vll r = karatsubaMultiply(a2, b2);
  312. for (int i = 0; i < (int) a1b1.size(); i++)
  313. r[i] -= a1b1[i];
  314. for (int i = 0; i < (int) a2b2.size(); i++)
  315. r[i] -= a2b2[i];
  316.  
  317. for (int i = 0; i < (int) r.size(); i++)
  318. res[i + k] += r[i];
  319. for (int i = 0; i < (int) a1b1.size(); i++)
  320. res[i] += a1b1[i];
  321. for (int i = 0; i < (int) a2b2.size(); i++)
  322. res[i + n] += a2b2[i];
  323. return res;
  324. }
  325.  
  326. bigint operator*(const bigint &v) const {
  327. vector<int> a6 = convert_base(this->a, base_digits, 6);
  328. vector<int> b6 = convert_base(v.a, base_digits, 6);
  329. vll a(a6.begin(), a6.end());
  330. vll b(b6.begin(), b6.end());
  331. while (a.size() < b.size())
  332. a.push_back(0);
  333. while (b.size() < a.size())
  334. b.push_back(0);
  335. while (a.size() & (a.size() - 1))
  336. a.push_back(0), b.push_back(0);
  337. vll c = karatsubaMultiply(a, b);
  338. bigint res;
  339. res.sign = sign * v.sign;
  340. for (int i = 0, carry = 0; i < (int) c.size(); i++) {
  341. long long cur = c[i] + carry;
  342. res.a.push_back((int) (cur % 1000000));
  343. carry = (int) (cur / 1000000);
  344. }
  345. res.a = convert_base(res.a, 6, base_digits);
  346. res.trim();
  347. return res;
  348. }
  349. };
  350.  
  351.  
  352. bool overflowcompare(bigint x,bigint upper,bigint mult)
  353. {
  354. if(x <=(upper+mult-1)/mult)
  355. return true;
  356. return false;
  357. }
  358. bigint alpa(bigint n,bigint number)
  359. {
  360. return n/number;
  361. }
  362. bool cmp(bigint a,bigint b,bigint c,bigint d)
  363. {
  364. int faq = 0;
  365. //cout<<a<<' '<<b<<' ';//<<faq<<endl;
  366. while(a!=0)
  367. {
  368. faq++;
  369. a/=c;
  370. }
  371. while(b!=0)
  372. {
  373. faq--;
  374. b/=d;
  375. }
  376. //cout<<faq<<endl;
  377. return faq>0;
  378. }
  379. int main()
  380. {
  381. /*
  382. freopen("jealous.in","r",stdin);
  383. freopen("jealous.out","w",stdout);
  384. */
  385. bigint a,b,p,q;
  386. cin>>a>>b>>p>>q;
  387. bigint ans =0ll;
  388. for(bigint i = 1;i<=b;i*=p)
  389. {
  390. // cout<<"the ith ::"<<i<<endl;
  391. for(bigint j=1;j<=b;j*=q)
  392. {
  393. bigint one=0,two=0,three=0,four=0;
  394. if(cmp(i,j,p,q)^1)continue;
  395.  
  396. // cout<<i<<' '<<j<<"::";;
  397. one = alpa(b,i*j) - alpa(a-1,i*j);
  398.  
  399. two = alpa(b,j*q*p*i) - alpa(a-1,j*q*p*i);
  400.  
  401.  
  402. three = alpa(b,i*p*j)-alpa(a-1,i*p*j);
  403.  
  404. four = alpa(b,j*q*i) - alpa(a-1,j*q*i);
  405.  
  406. ans+=one - three -four + two;
  407. // cout<<one - three -four + two<<' '<<one<<' '<<two<<' '<<three<<' '<<four<<endl;
  408.  
  409. }
  410. }
  411. cout<<ans<<endl;
  412. return 0;
  413. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement