Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

상품을 숨길 수 있는 방의 수를 알아내는 Python 프로그램

<시간/>

게임 쇼에서 원으로 배열된 2n개의 방이 있다고 가정합니다. 방 중 하나에는 참가자가 수집해야 하는 상품이 있습니다. 방의 번호는 1, 2, 3,...., n, -n, -(n - 1),...., -1입니다. 시계 방향으로. 각 방에는 문이 있고 그 문으로 다른 방을 방문할 수 있습니다. 모든 문에는 x 표시가 있습니다. 이는 다른 방이 현재 방에서 x 거리에 있음을 의미합니다. x 값이 양수이면 해당 방에서 시계 방향으로 x번째 방으로 문이 열립니다. x의 값이 음수이면 방이 시계 반대 방향으로 x번째 방으로 열립니다. 경품을 보관할 수 있는 방의 수를 알아내야 하고 참가자들이 경품을 찾는 데 어려움을 겪습니다.

따라서 입력이 input_array =[[4, 2]]와 같으면 출력은 [2]

가 됩니다.

입력에는 두 개의 값이 있습니다. 첫 번째 값은 방 수의 절반인 n이고 두 번째 값은 참가자가 상품을 찾기 시작하는 방 번호입니다. 여기에는 2x4 =8개의 방이 있으며 참가자는 시계 방향으로 두 번째 방부터 상품을 찾기 시작합니다. 방은 시계 방향으로 1, 2, 3, 4, -4, -3, -2, -1로 번호가 매겨집니다. 참가자는 2, -4, -1, 1, 3, -2, -1, 1, 3, -2, ...와 같은 방식으로 방을 방문하기 시작합니다. 따라서 방 4와 -3은 방문했을 때 이 두 방 중 하나에 상품이 숨겨져 있으면 참가자가 찾을 수 없습니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • prime_num_find() 함수를 정의합니다. n
      이 걸립니다.
    • p_nums :=값 2로 초기화된 새 목록

    • check :=요소의 바이트 표현을 포함하는 새 목록

  • 범위 3에서 n의 값에 대해 2만큼 증가, 수행

    • check[value]가 0이 아니면
      • 다음 반복으로 이동
    • p_nums 끝에 값 삽입
    • 범위 3 * 값에서 n까지의 i에 대해 각 단계에서 2 * 값으로 업데이트, do
      • 체크[i] :=1
    • p_nums 반환
  • factor_finder() 함수를 정의합니다. 이것은 p
      이 걸릴 것입니다
    • p_nums :=prime_num_find(45000)
    • f_nums :=새 지도
  • p_nums의 각 값에 대해 다음을 수행합니다.
    • 값 * 값> p가 0이 아니면
      • 루프에서 나오다
    • p mod 값이 0일 때 do
      • p :=(p / 값)의 하한값
      • 값이 f_nums에 있으면
        • f_nums[값] :=f_nums[값] + 1
      • 기타,
        • f_nums[값] :=0
  • p> 1이면
    • f_nums[p] :=1
    • 반환 f_nums
  • euler_func() 함수를 정의합니다. 이것은 p
      이 걸릴 것입니다
    • f_nums :=factor_finder(p)
    • t_value :=1
  • f_nums의 각 값에 대해 다음을 수행합니다.
    • t_value :=t_value * ((값-1) * 값^(f_nums[값] - 1))
      • t_value 반환
  • 주요 함수/메서드에서 다음을 수행합니다. -
  • 출력:=새 목록
  • input_array의 각 항목에 대해 다음을 수행합니다.
    • p :=항목[0]
    • q :=항목[1]
    • r :=2 * p + 1
    • r :=(r / (r, q mod r)의 gcd 값)의 하한값
    • t_value:=euler_func(r)
    • factor_finder(t_value)의 각 값에 대해 다음을 수행합니다.
      • t_value mod 값이 0이고 (2 ^(t_value/value) mod r의 floor 값)이 1인 동안 do
        • t_value :=(t_value / 값)의 하한값
    • 2 * p - 출력 끝에 t_value 삽입
  • 반환 출력

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

import math
def prime_num_find(n):
   p_nums = [2]
   check = bytearray(n)
   for value in range(3, n, 2):
      if check[value]:
         continue
      p_nums.append(value)
      for i in range(3 * value, n, 2 * value):
         check[i] = 1
   return p_nums
def factor_finder(p):
   p_nums = prime_num_find(45000)
   f_nums = {}
   for value in p_nums:
      if value * value > p:
         break
      while p % value == 0:
         p //= value
         f_nums[value] = f_nums.get(value,0) + 1
   if p > 1:
      f_nums[p] = 1
   return f_nums
def euler_func(p):
   f_nums = factor_finder(p)
   t_value = 1
   for value in f_nums:
      t_value *= (value-1) * value ** (f_nums[value]-1)
   return t_value
def solve(input_array):
   output = []
   for item in input_array:
      p, q = item[0], item[1]
      r = 2 * p + 1
      r //= math.gcd(r, q % r)
      t_value = euler_func(r)
      for value in factor_finder(t_value):
         while t_value % value == 0 and pow(2, t_value // value, r) == 1:
t_value //= value
         output.append(2 * p - t_value)
   return output
print(solve([[4, 2]]))

입력

[[4, 2]]

출력

[2]