321
社区成员




给定斜边z的值,求所有直角边x和y的组合数(x、y和z都是正整数)。
仅有一行输入,即斜边z的值(z是正整数,且z<10000000000000000000)
输出x和y的组合数(x和y是正整数)
嗯,本来想抄答案的,结果最近小伙伴们要么没有AC,要么没有代码,最可恶的是问哥,放出来一堆数学公式,欺负人呢。
算了,老顾执着的根据这个数学公式,弄了个 AC 出来,到底对不对,老顾也不知道。
于是就写了一堆代码
z = int(input())
def gcd(x,y):
x1 = zyinzi(x)
y1 = zyinzi(y)
u = set(x1) & set(y1)
r = 1
for n in u:
r *= n ** min(x1.count(n),y1.count(n))
return r
def zyinzi(n):
r = []
c = 2
while n > 1:
while n % c == 0:
r.append(c)
n //= c
c += 1
return r
def dfs(arr,n):
if len(arr) == 0:
return
for i,v in enumerate(arr):
nxt = n * v
y3.add(nxt)
dfs(arr[i + 1:],nxt)
y1 = [1] + zyinzi(2 * z)
y3 = set()
dfs(y1,1)
y3 = sorted(y3)
t = 0
for v in y3:
n = (2 * z / v) ** .5
for i in range(1,int(n) + 1):
y = (2 * z / v - i ** 2) ** .5
if y == int(y) and y != i and y > 0 and gcd(i,y) == 1:
t += 1
print(t // 2)
写完了尝试了一下,妈耶,居然AC了