Python程序找出可以隐藏奖品的房间数量
假设,在一个游戏节目中,有2n个房间,这些房间呈圆形排列。其中一个房间里藏着一个奖品,参与者必须收集它。房间从1、2、3、…、n、-n、-(n-1)、…、-1按顺时针方向编号。每个房间都有一扇门,通过这扇门可以访问另一个房间。每扇门上都有一个标记x,表示另一个房间距离当前房间x个单位。如果x的值为正,则门打开到从该房间顺时针方向的第x个房间。如果x的值为负,则表示门打开到从该房间逆时针方向的第x个房间。我们必须找出可以放置奖品的房间数量,以及参与者难以找到奖品的情况。
因此,如果输入类似于input_array = [[4, 2]],则输出将为[2]
输入有两个值,第一个值是n,它是房间总数的一半,第二个值是参与者开始寻找奖品的房间号。这里有2x4 = 8个房间,参与者从顺时针方向的第2个房间开始寻找奖品。房间按顺时针方向编号如下: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]不为零,则
- 跳过本次迭代
- 将value插入到p_nums的末尾
- 对于从3 * value到n的每个值,步长为2 * value,执行以下操作:
- check[i] := 1
- 返回p_nums
- 如果check[value]不为零,则
- 定义一个函数factor_finder()。这将接收p作为参数
- p_nums := prime_num_find(45000)
- f_nums := 一个新的映射
- 对于p_nums中的每个值,执行以下操作:
- 如果value * value > p不为零,则
- 退出循环
- 当p模value等于0时,执行以下操作:
- p := (p / value)的下取整
- 如果f_nums中存在value,则
- f_nums[value] := f_nums[value] + 1
- 否则,
- f_nums[value] := 0
- 如果value * value > p不为零,则
- 如果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 * ((value-1) * value^(f_nums[value] - 1))
- 返回t_value
- t_value := t_value * ((value-1) * value^(f_nums[value] - 1))
- 从主函数/方法中执行以下操作:
- output := 一个新的列表
- 对于input_array中的每个项目,执行以下操作:
- p := item[0]
- q := item[1]
- r := 2 * p + 1
- r := (r / (r, q模r)的最大公约数)的下取整
- t_value := euler_func(r)
- 对于factor_finder(t_value)中的每个值,执行以下操作:
- 当t_value模value等于0且(2 ^ (t_value / value)的下取整模r)等于1时,执行以下操作:
- t_value := (t_value / value)的下取整
- 当t_value模value等于0且(2 ^ (t_value / value)的下取整模r)等于1时,执行以下操作:
- 将2 * p - t_value插入到output的末尾
- 返回output
示例
让我们看看以下实现,以获得更好的理解:
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]
广告