Advertisement
Guest User

overengineering

a guest
Jun 29th, 2016
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.13 KB | None | 0 0
  1. from primefac import primefac
  2. from itertools import combinations
  3. from operator import mul
  4.  
  5.  
  6. def sum_divisible_by_p(p, start, limit):
  7.     stop = int((limit-1)/float(p))
  8.     return p*(stop+start)*(stop-start+1)/2
  9.  
  10.  
  11. def sum_divisible_fast(divisors, start, stop):
  12.     proper_divisors = []
  13.     for div in divisors:
  14.         proper_divisors.extend(list(primefac(div)))
  15.     divisors = list(set(proper_divisors))
  16.  
  17.     total = 0
  18.     for divisor in divisors:
  19.         total += sum_divisible_by_p(divisor, start, stop)
  20.  
  21.     for i in range(2, len(divisors)+1):
  22.         k = (-1)**(i-1)
  23.         for perm in combinations(divisors, i):
  24.             product = reduce(mul, list(perm))
  25.             total += k*sum_divisible_by_p(product, start, stop)
  26.     return int(total)
  27.  
  28.  
  29. def sum_divisible(divisors=[3, 5], start=0, stop=100):
  30.     count = 0
  31.     for num in xrange(start, stop):
  32.         for d in divisors:
  33.             if num % d == 0:
  34.                 count += num
  35.                 break
  36.     return count
  37.  
  38. if __name__ == "__main__":
  39.  
  40.     print sum_divisible([3, 5, 7, 13], 1, 100000)
  41.     print sum_divisible_fast([3, 5, 7, 13], 1, 100000)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement