问题描述
小U最近沉迷于一款冒险游戏,在闯关过程中,他通过击败小兵获得了防御宝石,每个防御宝石的价值为 aiai。经过一番激战,小U终于遇到了关底的boss,这个boss拥有攻击宝石,每颗攻击宝石的价值为 bibi。小U想知道他手中的防御宝石是否能够抵抗住boss的攻击。
小U的防御成功条件是:所有防御宝石的乘积 ∏i=1nai∏i=1nai 可以被所有攻击宝石的乘积 ∏i=1mbi∏i=1mbi 整除。你能帮小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'
from collections import defaultdict
import math
def prime_factors(n):
""" 返回 n 的质因数及其幂次 """
factors = defaultdict(int)
# 处理 2
while n % 2 == 0:
factors[2] += 1
n //= 2
# 处理奇数
for i in range(3, int(math.sqrt(n)) + 1, 2):
while n % i == 0:
factors[i] += 1
n //= i
if n > 2:
factors[n] += 1
return factors
def solution(n, m, arrayn, arraym):
# 存储防御宝石的质因数及其总幂次
defense_factors = defaultdict(int)
for a in arrayn:
factors = prime_factors(a)
for k, v in factors.items():
defense_factors[k] += v
# 存储攻击宝石的质因数及其总幂次
attack_factors = defaultdict(int)
for b in arraym:
factors = prime_factors(b)
for k, v in factors.items():
attack_factors[k] += v
# 检查防御宝石的质因数能否覆盖攻击宝石的质因数
for k, v in attack_factors.items():
if defense_factors[k] < v:
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")
print(solution(3, 4, [6, 3, 9], [2, 3, 4, 1]) == "no")