Advertisement
qekaqeka

3034 КЕГЭ

May 15th, 2023 (edited)
873
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.21 KB | None | 0 0
  1. #ПРЕДВАРИТЕЛЬНОЕ ОБЪЯСНЕНИЕ:
  2. #Для всех чисел, F(n) минимум 6
  3. #F(n) = 9 Для тех чисел, которые за прохождение функции были чётными и > 0 ровно три раза.
  4. #Минимальным таким числом будет 2^3 степени, иначе просто 8.
  5. #Струтура 8 будет 2*2*2.
  6. #Но структура числа может быть и другой. Например (2*2+1)*2*2 (20)
  7. #Разворачивая 20 мы будет иметь следующий ряд: 20 (деление на 2)-> 10 (деление на 2)-> 5 ( //2 )-> 2 (деление на 2)-> 1 ( //2 )-> 0
  8. #Видим что мы делили на 2 (не целочисленно) только 3 раза. Значит для F(20) = 9
  9. #Целочиселнное деление на 2 для нечётного числа n эквивалентно (n-1)/2
  10. #Обратной операцией будет n*2 + 1. Для обычного деления на 2 эквивалентом будет n*2
  11. #Когда мы целочисленно делим на 2 мы не меняем значение F(n).
  12. #Значит число n, для которого F(n) = 9, на пути разворачивания 3 раза будет просто делиться на 2 и X раз целочисленно делится на 2
  13. #Создавая число, для которого F(n) = 9, с помощью обратных операций, мы 3 раза просто умножим на 2, и X раз умножим на два и прибавим единицу
  14. #Вопрос: зависит ли созданное число от порядка выполнения операций? Докажем, что да
  15. #Возьмём два числа: 2*2*2*2 + 1 и (2*2*2+1)*2
  16. #Это числа в которых мы каждую из операций применили одинаковое для обоих чисел количество раз, но в разном порядке
  17. #Посчитав получим 17 и 18. Числа получились разные. Значит зависимость есть. НО!!!
  18. #Для всех ли разных комбинаций из Z операций мы получим разные числа? Докажем, что да
  19. #Операция *2 + 1, добавляет единицу, которая будет увеличиваться в 2 раза, с каждой следующей операцией
  20. #Получается такая единица добавляет к итоговому числу 2^i, i - кол-во операций после прибавления этой единицы
  21. #Чтобы числа не отличались, надо чтобы единицы добавили в сумме к итоговому число одинаковое число
  22. #НО!!! 2^i > 2^(i-1) + 2^(i-2) + ... + 2^0 . Так как 2^(i-1) + 2^(i-2) + ... + 2^0 - сумма геометрической прогрессии
  23. #2^(i-1) + 2^(i-2) + ... + 2^0 = (2^i - 1)/(1) = 2^i - 1
  24. #И очевидно, что 2^i > 2^i - 1
  25. #А если 2^(i-1) + 2^(i-2) + ... + 2^0, значит что единицу, которую прибавили на хотя бы на одну операцию раньше, не получится
  26. #набрать суммой единиц, которые добавили позже. Значит не получится составить одно и тоже число разными комбинациями,
  27. #так как если в одной из комбинации хотя бы одна операция *2+1 идёт раньше чем в другой,
  28. #то число, полученное этой комбинацией будет больше чем в другой
  29. #Значит количество N разных чисел, которые составлены из Z разных комбинаций операций, где Z = 3 + X, будет равно количество перестановок
  30. #3 "*2" операций и X "*2 + 1" операций. Значит N = (3+X)! / (3! * X!) (формула перестановок без повторений)
  31. #НО!!! Может быть так, что число, полученное нами, будет больше 1 000 000 000. А такие нам не подходят
  32. #Очевидно, что используя Z операций, мы получим наибольшее число, если все операции *2 + 1 поставим в начале.
  33. #А минимальное, если поставим в конце.
  34. #Найдём максимальное Z, при котором максимальное число <= 1 000 000 000
  35.  
  36. maxStableZ = -1
  37.  
  38. for Z in range(3, 1000):
  39.     n = 1
  40.  
  41.     for j in range(Z-3):
  42.         n = n*2 + 1
  43.  
  44.     n = n * 2**3
  45.  
  46.     if n > 1_000_000_000:
  47.         maxStableZ = Z - 1
  48.         break
  49.  
  50.  
  51. #Найдём максимальное Z при котором минимальное число будет <=  1 000 000 000
  52.  
  53. maxZ = -1
  54.  
  55. for Z in range(3, 1000):
  56.     n = 2**3
  57.  
  58.     for j in range(Z-3):
  59.         n = n*2 + 1
  60.  
  61.     if n > 1_000_000_000:
  62.         maxZ = Z - 1
  63.         break
  64.  
  65. #для Z <= maxStableZ, все числа из Z операций будут <= 1 000 000 000
  66. #поэтому просто посчитаем количество перестановок из Z in range(3, maxStableZ + 1) операций
  67.  
  68. import math
  69.  
  70. c = 0
  71.  
  72. for Z in range(3, maxStableZ + 1):
  73.     c += math.factorial(Z)/(math.factorial(3)*math.factorial(Z-3))
  74.  
  75. #для Z, где maxStableZ < Z <= maxZ , каждое составленное нами число придётся рассматривать отдельно
  76.  
  77. for i1 in range(0, maxZ):
  78.     for i2 in range(i1+1, maxZ):
  79.         for i3 in range(i2+1, maxZ):
  80.             a = [0] * maxZ
  81.             a[i1] = 1
  82.             a[i2] = 1
  83.             a[i3] = 1
  84.             n = 1
  85.             for j in a:
  86.                 if j == 1:
  87.                     n = n * 2
  88.                 else:
  89.                     n = n * 2 + 1
  90.  
  91.             if n <= 1_000_000_000:
  92.                 c += 1
  93.  
  94. print(c)
  95.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement