1. 程式人生 > >Codeforces1030D. Vasya and Triangle

Codeforces1030D. Vasya and Triangle

題目連結:http://codeforces.com/problemset/problem/1030/D

題意:給出一個n*m的矩形,再給出一個k,判斷在矩形中是否存在一個三角形,使得三角形的面積恰好是矩形面積的1/k

題解及程式碼:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
    ll n,m,k;
    cin>>n>>m>>k;
    ///假定在n*m矩陣中我們以原點(0,0)(x,0)(0,y)三點構建三角形
    ///那麼根據題意,有三角形面積 x*y/2  <= n*m/k
    ///因此, x*y <=2*n*m/k
    ///若此三角形就是我們需要的三角形,那麼 x*y == 2*n*m/k
    ///我們很容易看出2*n*m % k==0.
    ///即符合要求的三角形都滿足2*n*m % k==0
    if(2*n*m%k!=0){cout<<"NO";return 0;}
    else
    {
        cout<<"YES"<<endl;
        cout<<"0 0"<<endl;

    ///接下來找x,y
    ///前面已經說過2*n*m % k == 0
    ///也就是說k是2*n,2*m,n,m,2中的一個或多個的因子
    ///所以我們把2*n*m拆開成2*n和m;(也可以拆成2*m和n,結果無影響)
        ll gg = __gcd(2*n,k);
        ll x,y;
        if(gg==1)
        {
            ///不是2*n的因子,是m的因子
            ///也就是說我們可以直接選x=n,然後剩下的y=2*m/k
            x = n;
            y = 2*m/k;
        }else
        {
            ///公因子大於1,我們就取其剩餘部分就好了
            x = 2*n/gg;
            y = gg*m/k;
        }
        cout<<x<<" 0"<<endl;
        cout<<"0 "<<y<<endl;
    }



}