题意:给你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 }
原文地址:https://www.cnblogs.com/qywhy/p/9695344.html
时间: 2024-10-27 14:52:26