zoukankan      html  css  js  c++  java
  • Codeforces Round #512 (Div. 2) D.Vasya and Triangle 数学

    题面

    题意:给你n,m,k,在你在(0,0)到(n,m)的矩形内,选3个格点(x,y都是整数),使得三角形面积为n*m/k,不能找到则输出-1

    题解:由毕克定理知道,格点多边形的面积必为1/2的整数倍,所以首先n*m/k必须是1/2的整数倍,也就是2*n*m%k要等于0,不等于就输出-1

            然后对于面积,我们知道底✖高*1/2=面积,a*b*1/2=n*m/k,我们很显然想到一种构造方法,(0,0),(0,a),(b,0);

            有人就要问,会不会有一种,使得无法找到整数a,b,满足这种直角三角形点,但是可以在分数的底和高满足

            但其实我们分析,我们要找到整数a,b满足a*b=2*n*m/k,且a<=n,b<=m.  

            因为已经满足过2*n*m%k==0,所以k至少可以被2或者n的一个因子,或者m的一个因子整除,这个被整除的数也至少是2

           也就是说2*n*m/gcd(2,n,m)<=n*m(=当且仅当k==2时), 也就是说肯定可以拆成整数a,b;

         那答案就是a=n/(gcd(2*n,k))  b=m/(k/gcd(2*n,k));或者a=n/(k/gcd(2*m,k))  b=m/(gcd(2*m,k)); 满足a<=n b<=m的那种就是可行方案

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define lld long long 
     4 long long n,m,k;
     5 lld gcd(lld a,lld b)
     6 {
     7     if (b==0) return a;
     8     return gcd(b,a%b);
     9 }
    10 int main()
    11 {
    12     scanf("%lld%lld%lld",&n,&m,&k);
    13     if (n*m*2%k!=0)
    14     {
    15         printf("NO");
    16         return 0;
    17     }
    18     printf("YES
    0 0
    ");
    19     lld x=gcd(2*n,k),y;
    20     y=k/x;
    21     x=2*n/x;
    22     y=m/y;
    23     if (x<=n && y<=m)
    24     {
    25         printf("%lld %lld
    ",x,0ll);
    26         printf("%lld %lld
    ",0ll,y); 
    27     }else
    28     {
    29         x/=2;
    30         y*=2;
    31         printf("%lld %lld
    ",x,0ll);
    32         printf("%lld %lld
    ",0ll,y); 
    33     }
    34 }

        

    Anderyi!
  • 相关阅读:
    一次Access注入
    偏移注入
    DHCP协议
    ARP协议、ARP欺骗
    bWAPP_HTML Injection
    上网行为管理&云计算
    两个文件上传/包含
    SQL报错注入
    如何建立git 远程仓库
    PHP实现异步调用方法研究
  • 原文地址:https://www.cnblogs.com/qywhy/p/9695344.html
Copyright © 2011-2022 走看看