D. Vasya and Triangle(几何)

博客围绕一道几何题展开,题目要求根据给定的三个数n、m、k构造三个整数点,使构成的三角形面积等于(n*m)/k。题解指出2*(n*m)/k须为整数,介绍了用三个顶点坐标求三角形面积公式,还给出了固定点位置及求解x1、y2的方法。

题目链接

题意:给你三个数n,m,k。让你构造三个整数点,使得这三个点构成的三角形面积等于(n*m)/k;

题解:比赛的时候猜了一个结论就是2*(n*m)/k必须是整数,但是因为找不到证明的方法,然后写起来也比较复杂就放弃了。最后看了别人的题解发现还真是这样。

首先由解析几何,已知三个点坐标求 三角形面积
设A(x1,y1),B(x2,y2),C(x3,y3) 
由A-->B-->C-->A 按逆时针方向转。
即用三角形的三个顶点坐标求其面积的公式为: 
S=(1/2)*|(x1y2+x2y3+x3y1-x1y3-x2y1-x3y2)|                                                                                                                                     所以将三个整数点带进去,所得的面积乘2必定也是一个整数。

将一个点固定在原点,另外两个点分别固定在x轴正半轴,和y轴正半轴。

因为 2nm%k=0,则 2nm 必包含 k 所有的素因子,求得 u=gcd(2n,k)

若 u=1,显然 m 可以整除 k,令 x1=n,y2=2×m/k即可;

否则令 x1=2×n/u,y2=m×u/k即可。


 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	ll n,m,k;
	cin>>n>>m>>k;
	if(n*m*2%k!=0) return puts("NO"),0;
	ll u = __gcd(2*n,k);
	puts("YES");
	puts("0 0");
	if(u==1){
		cout<<n<<' '<<0<<endl;
		cout<<0<<' '<<2*m/k<<endl;
	}
	else {
		cout<<2*n/u<<' '<<0<<endl;
		cout<<0<<' '<<m*u/k<<endl;
	}
 } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值