Codeforces Round #512 (Div. 2) D. Vasya and Triangle(几何+思维)

题目

题意:

  给出 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),就是答案。

 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 }
View Code

猜你喜欢

转载自www.cnblogs.com/thunder-110/p/10121082.html