zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    c++第二十八天
    pyDay16
    c++第二十七天
    c++第二十六天
    WinForm 应用程序的打包与部署
    更换Winform 皮肤(下)----完全GDI+绘制
    更换Winform 皮肤(上)----使用现有皮肤
    KeyValuePair用法(转)
    C#中HashTable的用法
    WinForm----DataGridview---连接数据库,以及双击一条数据,显示信息到Label控件,也可以是TextBox控件。
  • 原文地址:https://www.cnblogs.com/00isok/p/9723942.html
Copyright © 2011-2022 走看看