1. 程式人生 > >Codeforces - 1053 - A. Vasya and Triangle

Codeforces - 1053 - A. Vasya and Triangle

 題目連結<http://codeforces.com/contest/1053/problem/A>


題意:

問能否選取三個點,(x1,y1) (x2,y2), (x3,y3),且0≤x1,x2,x3≤n, 0≤y1,y2,y3≤m。使得三個點組成的三角形面積為n*m/k。如果可以,輸出任意三個點即可。


題解:

首先可以發現,如果2*n*m%k不等於零那就肯定不可以。

至於構造的方法,很容易想到,確定一個點在原點,另外兩個點在座標軸上。

因為一定是整數點,且2*n*m%k==0,那麼可以設t=gcd(2*n,k),也就一定可以構造出另外兩個整數點:(2*n/t,0),(0,m*t/k)。

但當t==0的時候可能會越界,而此時gcd(2*n,k)一定不為1,所以反過來就行了。


#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
    ll n,m,k;
    scanf("%lld%lld%lld",&n,&m,&k);
    if(2*n*m%k) printf("NO\n");
    else{
        printf("YES\n");
        int t=__gcd(2*n,k);
        if(t!=1) printf("0 0\n%lld 0\n0 %lld\n",2*n/t,t*m/k);
        else{
            t=__gcd(2*m,k);
            printf("0 0\n%lld 0\n0 %lld\n",n*t/k,2*m/t);
        }
    }
    return 0;
}