码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #512 (Div. 2) D.Vasya and Triangle 数学

时间:2018-09-24 14:44:34      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:problems   分析   div   lse   nbsp   题意   tps   style   c++   

题面

题意:给你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\n0 0\n");
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\n",x,0ll);
26         printf("%lld %lld\n",0ll,y); 
27     }else
28     {
29         x/=2;
30         y*=2;
31         printf("%lld %lld\n",x,0ll);
32         printf("%lld %lld\n",0ll,y); 
33     }
34 }

 

    

Codeforces Round #512 (Div. 2) D.Vasya and Triangle 数学

标签:problems   分析   div   lse   nbsp   题意   tps   style   c++   

原文地址:https://www.cnblogs.com/qywhy/p/9695344.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!