题意:
给出 n,m,k ,让你在长为 n,宽为 m 的坐标系里构建一个三角形,使得面积= n*m/k。如果存在,输出“YES”,输出三角形三个顶点的坐标; 如果不存在,输出“NO”。
思路:
参考其他人博客。 设长为a ,宽为b,所以要 a*b/2 = (n*m)/k ,要使有解,必须 2*n*m/k 是整数,所以只要讨论 2*n*m/k 就可。如果k=1,a<=n和b<=m范围内 一定 a*b/2 != n*m,所以 k >=2 。
设g= gcd( 2*n, k ):
如果g==1,则说明 2*n 不可能整除 k ,所以只能是2*m整除k ,这里可以得出a=n, b=2*m/k
如果 2<= g <= k ,则可以设 a=2*n/g(因为g>=2,所以a<=n),b=m*g/k(因为g<=k,所以b<=m),就是答案。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include <cctype> 4 #include<algorithm> 5 #include<cstring> 6 #include<cmath> 7 #include<string> 8 #include<cmath> 9 #include<set> 10 #include<vector> 11 #include<stack> 12 #include<queue> 13 #include<map> 14 using namespace std; 15 #define ll long long 16 #define mem(a,x) memset(a,x,sizeof(a)) 17 #define se second 18 #define fi first 19 const ll mod=1e9+7; 20 const int INF= 0x3f3f3f3f; 21 const int N=3e5+5; 22 23 ll n,k,m; 24 25 ll gcd(ll x,ll y) 26 { 27 return y==0?x:gcd(y,x%y); 28 } 29 int main() 30 { 31 cin>>n>>m>>k; 32 if( (2*m*n) %k!=0 || k<2) 33 { 34 cout<<"NO"<<endl; 35 return 0; 36 } 37 cout<<"YES"<<endl; 38 cout<<0<<' '<<0<<endl; 39 40 ll a,b,g; 41 g=gcd(2*n,k); 42 if(g==1) 43 { 44 a=n; b=2*m/k; 45 } 46 else 47 { 48 a=2*n/g; b=m*g/k; 49 } 50 cout<<a<<' '<<0<<endl; 51 cout<<0<<' '<<b<<endl; 52 }