"""
P,Q 是正整数。
x0为最大公约数,以y0为最小公倍数。
"""
x0, y0 = map(int, input().split())
def gcd(x, y): # 最大公约数
if x < y:
x, y = y, x
r = x % y # x是大数 y是小数 24%15
while r != 0:
x = y
y = r
r = x % y
return y
def lcm(x, y): # 最小公倍数 x是大数 y是小数
if x < y:
x, y = y, x
m = x
while x % y != 0:
x = x+m
return x
n = x0 * y0 # 两个数的积等于它们最大公约数和它们最小公倍数的积
# 就是不要死脑筋 不要想着P和Q是两个数 其实循环一个另外一个也出来了 i和n//i 不就出来了呗
ans = 0
for i in range(x0,y0+1): # x×y=P×Q, gcd(x,y)=P ,lcm(x,y)=Q
if n % i == 0 and gcd(i, n // i) == x0 and lcm(i, n // i) == y0: # 能被整除 且i和n//i的最小公倍数是y0 最大公约数是x0
ans += 1
print(ans)
完全可以优化,首先GCD和LCM在math库中都有,循环次数也不需要那么大,因为有重复的,if条件只需要两个就可以了,不需要三个。这样写只是为了能看懂,也说一下最小公倍数和最大公约数的写法