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

  • 相关阅读:
    springboot属性类自动加载配置文件中的值
    mysql修改root密码
    idea各种图标说明
    nginx安装配置
    notepad++下载32位,安装插件管理
    crontab 定时执行脚本出错,但手动执行脚本正常
    jenkins安装配置
    VirtualBox从USB设备(PE)启动图文教程
    如何卸载windows的服务?卸载服务?
    在Windows的CMD中如何设置支持UTF8编码?
  • 原文地址:https://www.cnblogs.com/00isok/p/9723942.html
Copyright © 2011-2022 走看看