问题描述
小U最近沉迷于一款冒险游戏,在闯关过程中,他通过击败小兵获得了防御宝石,每个防御宝石的价值为 𝑎 𝑖 a i 。经过一番激战,小U终于遇到了关底的boss,这个boss拥有攻击宝石,每颗攻击宝石的价值为 𝑏 𝑖 b i 。小U想知道他手中的防御宝石是否能够抵抗住boss的攻击。 小U的防御成功条件是:所有防御宝石的乘积 ∏𝑖=1 𝑛 𝑎 𝑖 ∏ i=1 n a i 可以被所有攻击宝石的乘积 ∏ 𝑖 1 𝑚 𝑏 𝑖 ∏ i=1 m b i 整除。你能帮小U判断他是否能够抵抗住boss的攻击吗?
测试样例
样例1:
输入:n = 2 ,m = 5 ,arrayn = [10, 12] ,arraym = [2, 3, 5, 2, 1] 输出:'yes'
样例2:
输入:n = 4 ,m = 5 ,arrayn = [7, 2, 5, 3] ,arraym = [2, 4, 5, 6, 1] 输出:'no'
样例3:
输入:n = 3 ,m = 4 ,arrayn = [6, 3, 9] ,arraym = [2, 3, 4, 1] 输出:'no'
解题思路
质因数分解:将每个防御宝石和攻击宝石的值进行质因数分解。
统计质因数:统计每个质因数在防御宝石和攻击宝石中的出现次数。
比较质因数:对于每个质因数,防御宝石中的出现次数必须大于等于攻击宝石中的出现次数。
代码实现(以PYthon实现)
def solution(n, m, arrayn, arraym): from collections import defaultdict
# 质因数分解函数
def prime_factors(num):
factors = defaultdict(int)
divisor = 2
while num >= 2:
while num % divisor == 0:
factors[divisor] += 1
num //= divisor
divisor += 1
return factors
# 统计防御宝石的质因数
defense_factors = defaultdict(int)
for num in arrayn:
factors = prime_factors(num)
for factor, count in factors.items():
defense_factors[factor] += count
# 统计攻击宝石的质因数
attack_factors = defaultdict(int)
for num in arraym:
factors = prime_factors(num)
for factor, count in factors.items():
attack_factors[factor] += count
# 比较质因数
for factor, count in attack_factors.items():
if defense_factors[factor] < count:
return "no"
return "yes"
if __name__ == "__main__":
print(solution(2, 5, [10, 12], [2, 3, 5, 2, 1]) == "yes")
print(solution(4, 5, [7, 2, 5, 3], [2, 4, 5, 6, 1]) == "no")
关键步骤解释
质因数分解函数:prime_factors 函数用于将一个数分解为质因数,并统计每个质因数的出现次数。
统计质因数:分别统计防御宝石和攻击宝石的质因数。
比较质因数:对于每个质因数,检查防御宝石中的出现次数是否大于等于攻击宝石中的出现次数。
可能遇到的问题: 如何判断一个数的质因数分解?
思路
质因数分解是将一个正整数分解为若干个质数的乘积的过程。我们可以通过以下步骤来实现质因数分解: 步骤
初始化:从最小的质数2开始,逐步尝试将目标数除以当前质数。
除法操作:如果目标数能被当前质数整除,则记录该质数,并将目标数除以该质数,继续尝试除以该质数,直到不能整除为止。
递增质数:如果目标数不能被当前质数整除,则尝试下一个质数。
终止条件:当目标数小于等于1时,分解结束。
代码实现
from collections import defaultdict
def prime_factors(num):
factors = defaultdict(int)
divisor = 2
while num >= 2:
while num % divisor == 0:
factors[divisor] += 1
num //= divisor
divisor += 1
return factors
# 示例
print(prime_factors(10)) # 输出: defaultdict(<class 'int'>, {2: 1, 5: 1})
print(prime_factors(12)) # 输出: defaultdict(<class 'int'>, {2: 2, 3: 1})
print(prime_factors(24)) # 输出: defaultdict(<class 'int'>, {2: 3, 3: 1})
解释及注意事项
解释
初始化:factors 是一个 defaultdict,用于存储每个质因数的出现次数。divisor 从2开始。
除法操作:在 while num % divisor == 0 循环中,如果 num 能被 divisor 整除,则将 divisor 记录到 factors 中,并将 num 除以 divisor。
递增质数:如果 num 不能被 divisor 整除,则 divisor 递增1,尝试下一个可能的质数。
终止条件:当 num 小于等于1时,分解结束。
注意
这个函数返回一个 defaultdict,其中键是质因数,值是该质因数的出现次数。 这个方法适用于正整数。
总结
该题主要考察了质因数,难度偏大。