mirror of
https://github.com/TheAlgorithms/Python.git
synced 2025-01-31 14:43:43 +00:00
329feb4928
* Create sol1.py * updating DIRECTORY.md * Create __init__.py * Add docstring * Reformat with black * Fix flake8 issues * Add EOL * Fix formatting issues * Add docstring * Add func return type * Change return type * Remove test print statement * Reformat code * Fix return types * Break loop * Update doctest sol * Update project_euler/problem_078/sol1.py Co-authored-by: John Law <johnlaw.po@gmail.com> * Added doctest and changed return type * Add int() * Fix flake8 issues * Use argument instead of fixed constant * Update sol1.py * fix sol1.py Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Co-authored-by: John Law <johnlaw.po@gmail.com>
56 lines
1.2 KiB
Python
56 lines
1.2 KiB
Python
"""
|
|
Problem 78
|
|
Url: https://projecteuler.net/problem=78
|
|
Statement:
|
|
Let p(n) represent the number of different ways in which n coins
|
|
can be separated into piles. For example, five coins can be separated
|
|
into piles in exactly seven different ways, so p(5)=7.
|
|
|
|
OOOOO
|
|
OOOO O
|
|
OOO OO
|
|
OOO O O
|
|
OO OO O
|
|
OO O O O
|
|
O O O O O
|
|
Find the least value of n for which p(n) is divisible by one million.
|
|
"""
|
|
|
|
import itertools
|
|
|
|
|
|
def solution(number: int = 1000000) -> int:
|
|
"""
|
|
>>> solution()
|
|
55374
|
|
"""
|
|
partitions = [1]
|
|
|
|
for i in itertools.count(len(partitions)):
|
|
item = 0
|
|
for j in itertools.count(1):
|
|
sign = -1 if j % 2 == 0 else +1
|
|
index = (j * j * 3 - j) // 2
|
|
if index > i:
|
|
break
|
|
item += partitions[i - index] * sign
|
|
index += j
|
|
if index > i:
|
|
break
|
|
item += partitions[i - index] * sign
|
|
item %= number
|
|
|
|
if item == 0:
|
|
return i
|
|
partitions.append(item)
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import doctest
|
|
|
|
doctest.testmod()
|
|
|
|
print(f"{solution() = }")
|