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\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 }

    

猜你喜欢

转载自www.cnblogs.com/qywhy/p/9695344.html