TheAlgorithms-Python
62 строки · 1.3 Кб
1"""
2Problem 78
3Url: https://projecteuler.net/problem=78
4Statement:
5Let p(n) represent the number of different ways in which n coins
6can be separated into piles. For example, five coins can be separated
7into piles in exactly seven different ways, so p(5)=7.
8
9OOOOO
10OOOO O
11OOO OO
12OOO O O
13OO OO O
14OO O O O
15O O O O O
16Find the least value of n for which p(n) is divisible by one million.
17"""
18
19import itertools
20
21
22def solution(number: int = 1000000) -> int:
23"""
24>>> solution(1)
251
26
27>>> solution(9)
2814
29
30>>> solution()
3155374
32"""
33partitions = [1]
34
35for i in itertools.count(len(partitions)):
36item = 0
37for j in itertools.count(1):
38sign = -1 if j % 2 == 0 else +1
39index = (j * j * 3 - j) // 2
40if index > i:
41break
42item += partitions[i - index] * sign
43item %= number
44index += j
45if index > i:
46break
47item += partitions[i - index] * sign
48item %= number
49
50if item == 0:
51return i
52partitions.append(item)
53
54return 0
55
56
57if __name__ == "__main__":
58import doctest
59
60doctest.testmod()
61
62print(f"{solution() = }")
63