Tih_Monkes's blog

By Tih_Monkes, history, 3 hours ago, In Russian

Вам дано N (1 <= N <= 10 ^ 18). Найдите такое наибольшее K(K < N), S(P(N)) mod S(P(K)) = 0; S(n) — сумма от 1 до n; P(n) — множество чисел от 1 до n; n = int(input()) for i in range(n - 1, 0, -1): if((n * (n + 1) // 2) % (k * (k + 1) // 2) == 0): print(k) exit() Такой алгоритм имеет сложность O(n) что плохо для входных данных этой проблемы!! Рассмотрим реализацию бин поиска, ведь у нас по факту есть уравнение: S(n) mod S(k) = 0;(n * (n + 1) = x*k*(k + 1)); n = int(input()) l = 1 r = n - 1 ans = 0 while(l <= r): mid = (l + r) // 2 if((n * (n + 1)) % (mid * (mid + 1)) == 0): ans = mid l = mid + 1 else: r = mid - 1 print(ans) Такой алгоритм работает за O(log n) что при данных ограничениях не превзойдёт O(18). Спасибо за внимание.

  • Vote: I like it
  • 0
  • Vote: I do not like it