题意:
略
思路:
令三角形面积为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 <bits/stdc++.h>
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;
}