Codeforces Round #512 D. Vasya and Triangle

本文详细解析了一个数学问题——如何在一个限定范围内构造一个特定面积的直角三角形。通过设定其中一个顶点在原点,利用x轴和y轴上的点来形成三角形,推导出x和y的关系,并通过最大公约数的概念找到符合条件的x和y值。文章提供了具体的Python代码实现。

思路:

 计算面积,且限制了x,y的最大值,因此首先固定三角形的一个点在原点(0,0)。由于任何一个三角形都存在与之面积相同的直角三角形,因此我们将另两个点选在坐标轴上,设为 (x,0) 与 (0,y)
 因此我们可以得到等式xy=2mnkxy = \frac{2mn}{k}xy=k2mn

 题目中要求x<n,y<m,由于k>=2,因此只要等式右侧的计算结果为整数,那么一定存在符合条件的x和y。


 首先判断k是否为偶数:

 若为偶数,可以将分子的2消去,再计算n和k的最大公约数,令x为n消去最大公约数后的值,y为m/k消去最大公约数后的值。
 (因为等式右边最后是一个整数,说明k可以和mn除开,k和n的最大公约数,就是k可以和n除开的部分,剩下的部分自然就是可以和m除开的部分。)

 若为奇数,则x或y中有一个数需要再乘2。为了使x和y不超过界限,需要判断n和k的最大公约数是否大于等于2,若是的话,则可以在x上乘2;若不是,说明k和n互质,那么k全部和m除,在y上乘2即可。

代码:
# D. Vasya and Triangle
# a * b = 2 * m * n / k


def gcd(x, y):
    return x if y == 0 else gcd(y, x%y)


n, m, k = map(int, input().split())
if (2 * n * m) % k != 0:
    print("NO")
    exit()
print("YES")

flag = True
if k % 2 == 0:
    k /= 2
else:
    flag = False

gcd_ans = gcd(n, k)
x = n / gcd_ans
y = m / (k / gcd_ans)
if flag == False:
    if gcd_ans >= 2:
        x *= 2
    else:
        y *= 2

print(str(int(x)) + " 0")
print("0 " + str(int(y)))
print("0 0")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值