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
");
        if((2*m)%k==0){      
            printf("%lld 0
",n);
            printf("0 %lld
",2*m/k);
        }
        else if((2*n)%k==0){
            printf("%lld 0
",2*n/k);
            printf("0 %lld
",m);
        }
        else{  //三角形两条直角边均不为满边的情况
            ll tmp=gcd(2*n,k);
            printf("%lld 0
",2*n/tmp);
            printf("0 %lld
",m*tmp/k);
        }
    }
    return 0;
}

2018-09-29

原文地址:https://www.cnblogs.com/00isok/p/9723942.html