Advertisement
chaosagent

Broken Good Numbers

Sep 2nd, 2015
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.08 KB | None | 0 0
  1. import math
  2.  
  3. def gcd(a, b):
  4.     while b:
  5.         a %= b
  6.         a, b = b, a
  7.     return a
  8.  
  9. l, r, p, q = map(int, raw_input().strip().split(' '))
  10. ol, oR, op, oq = l, r, p, q
  11. if p == q:
  12.     print 0
  13.     exit()
  14. gcdpq = gcd(p, q)
  15. l = int(math.ceil(float(l)/gcdpq))
  16. r = int(float(r)/gcdpq)
  17. p /= gcdpq
  18. q /= gcdpq
  19. if p == 1:
  20.     total = None
  21.     if q % op != 0:
  22.         total = (oR / op - (ol - 1) / op) - (oR / oq - (ol - 1) / oq) + (oR / (op * oq) - (ol - 1) / (op * oq))
  23.     else:
  24.         total = (oR / op - (ol - 1) / op)
  25.     print total
  26.     exit()
  27. if q == 1:
  28.     print 0
  29.     exit()
  30.  
  31. maxppower = int(math.log(r, p))
  32. maxqpower = int(math.log(r, q))
  33. total = 0
  34. doubleremoved = 0
  35. for power in xrange(maxppower, 0, -1):
  36.     poweredp = p ** power
  37.     poweredq = q ** power
  38.     total = r / poweredp - (l - 1) / poweredp - ((r / (poweredp * poweredq) - (l - 1) / (poweredp * poweredq)) - doubleremoved)
  39.     doubleremoved = r / (poweredp * q ** (power - 1)) - (l - 1) / (poweredp * q ** (power - 1)) - (r / (poweredp * poweredq) - (l - 1) / (poweredp * poweredq))
  40.  
  41. print total
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement