840 Sum of Products.py 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #!/usr/bin/python
  2. # https://projecteuler.net/problem=840
  3. from sympy import primerange, isprime, factorint
  4. def D(n, memo):
  5. if n == 1:
  6. return 1
  7. if isprime(n):
  8. return 1
  9. if n in memo:
  10. return memo[n]
  11. # Factorize n into p and q
  12. factors = factorint(n)
  13. p = list(factors.keys())[0]
  14. q = n//p
  15. result = D(p, memo) * q + p * D(q, memo)
  16. memo[n] = result
  17. return result
  18. def G(partition):
  19. result = 1
  20. for a_j in partition:
  21. result *= D(a_j, {})
  22. return result
  23. def S(N, mod):
  24. total_sum = 0
  25. for n in range(1, N + 1):
  26. partitions = generate_partitions(n)
  27. for partition in partitions:
  28. total_sum += G(partition)
  29. return total_sum % mod
  30. def generate_partitions(n):
  31. def partition(n, I=1):
  32. yield (n,)
  33. for i in range(I, n//2 + 1):
  34. for p in partition(n-i, i):
  35. yield (i,) + p
  36. return list(partition(n))
  37. # Calculate S(5 * 10^4) % 999676999
  38. #result = S(5 * 10**4, 999676999)
  39. result = S(10, 999676999)
  40. print(result)