1. 程式人生 > >codeforces 1030D Vasya and Triangle【思維+gcd】

codeforces 1030D Vasya and Triangle【思維+gcd】

題目:戳這裡

題意:選出三個點構成三角形,要求面積為n*m/k。

解題思路:因為三個點的座標都是正整數,根據三角形面積公式(x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2))/2=n*m/k可知,若三角形存在,則2*n*m/k必為整數。若面積*2為整數,則把該三角形放置在x軸上即可。於是設x1=0,y1=0,x2=a,y2=0,x3=0,y3=b;求a*b=2*n*m/k。(0<=a<=n,0<=b<=m)

欲找到滿足條件,可以利用最大公約數。若gcd(2*n,k)==1,則gcd(2*m,k)>=2; b=2*m/gcd(2*m,k) <=m,a=n/(k/gcd(2*m,k)<=n,反之若gcd(2*n,k)>=2同理。

附ac程式碼:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int inf = 0x3f3f3f3f;
 5 const int maxn = 2e3 + 10;
 6 #define lowbit(x) x&-x
 7 ll gcd(ll a, ll b) {
 8     return b?gcd(b,a%b):a;
 9 }
10 int main() {
11     ll n, m, k;
12     scanf("%lld %lld %lld
", &n, &m, &k); 13 if(2ll * n * m %k != 0) { 14 puts("NO"); 15 return 0; 16 } 17 puts("YES"); 18 puts("0 0"); 19 ll x2, y2, x3, y3; 20 ll sum = 2ll * n * m / k; 21 // printf("%lld\n", gcd(2ll*n,k)); 22 if(gcd(2ll*n,k) == 1) { 23 ll u = gcd(2ll*m, k);
24 printf("%lld %lld\n%lld %lld", n/(k/u), 0ll, 0ll, 2ll*m/u); 25 } else { 26 ll u = gcd(2ll*n, k); 27 printf("%lld %lld\n%lld %lld", 2ll*n/u, 0ll, 0ll, m/(k/u)); 28 } 29 return 0; 30 }
View Code