codeforces 1058D.Vasya and Triangle (gcd)
<题目链接>
<转载于 >>> >
题目大意:
给出n、m、k.求一个三角形使它的面积等于n*m/k 并且这个三角形的三个顶点所在的坐标为整数点,且顶点满足0<=x<=n,0<=y<=m.询问是否存在这样的三角形。若存在则输出任意一种符合情况的三个顶点。
解题分析:
1.每个坐标为整数的三角形的面积 * 2是整数。(可证明)
2.由1可得若存在满足题意的三角形,则n,m,k一定满足式子 2mn % k == 0。所以此时可以判掉NO的情况,剩下的一定是YES。
3.讨论三种情况 (2m) % k == 0,(2n) % k == 0,(2mn)%k == 0。
a.(2m)%k==0,横坐标可以为n,满边,纵坐标为2m/k。
b.同理,纵坐标为m,横坐标为2n/k。
c.此时可知2m%k!=0 ,2n%k!=0,2mn%k == 0。
此时没有边是满边,所以此时求t = gcd(2n,k)t!=1
,并且此时横坐标为2n/t,纵坐标可以由面积 * 2 / 横坐标得到(m * t)%k。
#include <cstdio> typedef long long ll; ll gcd(ll a,ll b){ return a%b==0? b:gcd(b,a%b); } int main(){ ll n,m,k; scanf("%lld%lld%lld",&n,&m,&k); if(2*n*m%k!=0)puts("NO"); else{ puts("YES"); printf("0 0\n"); if((2*m)%k==0){ printf("%lld 0\n",n); printf("0 %lld\n",2*m/k); } else if((2*n)%k==0){ printf("%lld 0\n",2*n/k); printf("0 %lld\n",m); } else{ //三角形两条直角边均不为满边的情况 ll tmp=gcd(2*n,k); printf("%lld 0\n",2*n/tmp); printf("0 %lld\n",m*tmp/k); } } return 0; }
2018-09-29
作者:is_ok
出处:http://www.cnblogs.com/00isok/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。