1. 程式人生 > >Codeforces Round #512 (Div. 2) D. Vasya and Triangle(幾何+思維)

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