def solve_ver1(n):
def gcd(a, b):
while b: a, b = b, a % b
return a
result = 1
for i in range(2, n + 1):
result = result // gcd(result, i) * i
return result
def solve_ver2(n):
sieved = [False] * (n + 1)
result = 1
for i in range(2, n + 1):
if not sieved[i]: # i — очередное простое число
for j in range(i, n + 1, i): # выкалывание составных, кратных i
sieved[j] = True
x = i # x будет максимальной степенью i, не превышающей n
while True:
nx = x * i
if nx > n: break
x = nx
# в новом синтаксисе этот цикл можно записать как while (nx := x * i) <= n: x = nx :^)
result *= x
return result
print(solve_ver1(100))
print(solve_ver2(100))
ZGVmIHNvbHZlX3ZlcjEobik6CglkZWYgZ2NkKGEsIGIpOgoJCXdoaWxlIGI6IGEsIGIgPSBiLCBhICUgYgoJCXJldHVybiBhCglyZXN1bHQgPSAxCglmb3IgaSBpbiByYW5nZSgyLCBuICsgMSk6CgkJcmVzdWx0ID0gcmVzdWx0IC8vIGdjZChyZXN1bHQsIGkpICogaQoJcmV0dXJuIHJlc3VsdAoKZGVmIHNvbHZlX3ZlcjIobik6CglzaWV2ZWQgPSBbRmFsc2VdICogKG4gKyAxKQoJcmVzdWx0ID0gMQoJZm9yIGkgaW4gcmFuZ2UoMiwgbiArIDEpOgoJCWlmIG5vdCBzaWV2ZWRbaV06ICMgaSDigJQg0L7Rh9C10YDQtdC00L3QvtC1INC/0YDQvtGB0YLQvtC1INGH0LjRgdC70L4KCQkJZm9yIGogaW4gcmFuZ2UoaSwgbiArIDEsIGkpOiAjINCy0YvQutCw0LvRi9Cy0LDQvdC40LUg0YHQvtGB0YLQsNCy0L3Ri9GFLCDQutGA0LDRgtC90YvRhSBpCgkJCQlzaWV2ZWRbal0gPSBUcnVlCgoJCQl4ID0gaSAjIHgg0LHRg9C00LXRgiDQvNCw0LrRgdC40LzQsNC70YzQvdC+0Lkg0YHRgtC10L/QtdC90YzRjiBpLCDQvdC1INC/0YDQtdCy0YvRiNCw0Y7RidC10LkgbgoJCQl3aGlsZSBUcnVlOgoJCQkJbnggPSB4ICogaQoJCQkJaWYgbnggPiBuOiBicmVhawoJCQkJeCA9IG54CgkJCSMg0LIg0L3QvtCy0L7QvCDRgdC40L3RgtCw0LrRgdC40YHQtSDRjdGC0L7RgiDRhtC40LrQuyDQvNC+0LbQvdC+INC30LDQv9C40YHQsNGC0Ywg0LrQsNC6IHdoaWxlIChueCA6PSB4ICogaSkgPD0gbjogeCA9IG54IDpeKQoKCQkJcmVzdWx0ICo9IHgKCXJldHVybiByZXN1bHQKCnByaW50KHNvbHZlX3ZlcjEoMTAwKSkKcHJpbnQoc29sdmVfdmVyMigxMDApKQ==