Codeforces Round #512 D - Vasya and Triangle 思路+gcd

题意:

思路:

令三角形面积为S,

因为题目要求的三角形的三个点是整点,所以2*S是正数,证明:我们在第一象限中找到此三角形的外接矩形,令其面积为S1,令在此矩形中三角形外的部分面积为S2,则有 S = S1 - S2   ->  2*S = 2*S1 - 2*S2;   S2由1or2or3 个直角三角形组成,直角边都是整数,即证所求;

题目要求 S =  (n * m) / k;   那么 2*S = (2 * n * m) / k 必须是整数,这样就一定有解,否则没有这样的三角形,

我们令构造的这个三角形为以原点为直角点,直角边边长分别为n_(初始值为n),  m_(初始值为m)  的直角三角形

因为  k 可以整除 (2 * n * m), 所以我们思路就是把k分解为 k = a1 * a2 * .... 的形式,同时我们可以令n_或 m_,除以ai,因为可以整除,所以最后可以使得k为1,这样我们得到的新的n_ 和 m_, 选择一个乘以系数2并且满足长宽条件的例子输出,即为答案;

但是我们分解k的这个过程可以直接简化为分别跟 n_ m_ 求取gcd;

 

#include 
using namespace std;
typedef long long ll;
const int maxn = 100 + 7;

ll n, m, k;

int main() {
    cin >> n >> m >> k;
    ll t = 2 * n * m;
    if(t / k * k != t) {
        return 0*puts("NO");
    }
    ll x = 2LL, n_ = n, m_ = m, k_ = k;
    ll g = __gcd(x, k_);
    x /= g; k_ /= g;
    g = __gcd(n_, k_);
    n_ /= g; k_ /= g;
    m_ /= k_;

    puts("YES");
    if(n_ * x <= n) {
        n_ *= x;
        cout << 0 << " " << 0 << endl;
        cout << 0 << " " << m_ << endl;
        cout << n_ << " " << 0 << endl;
        return 0;
    }
    else if(m_ * x <= m) {
        m_ *= x;
        cout << 0 << " " << 0 << endl;
        cout << 0 << " " << m_ << endl;
        cout << n_ << " " << 0 << endl;
        return 0;
    }
    puts("NO"); // 这一步比赛时没有严格证明,加上一定不会错
    return 0;
}

 

你可能感兴趣的:(codefoces,GCD)