题目:给定n,m,k 判断是否存在三角形 三点在端点 且(0<=x<=n ,0<=y<=m),面积 = n*m/k
http://codeforces.com/contest/1058/problem/D
思路:很容易知道 在网格上的三角形 ,面积*2是整数,所以n*m*2%k!=0 就是no
所以可以把一个点放在原点 a*b/2 = n*m/k 也就是 ab = 2nm/k
这种求出个特解(a,0) (0,b) ,利用gcd
如果 gcd(2n,k) >=2 a = 2*n/gcd(2ll*n,k) , 则 a<=n, b= 2nm/k/a = m/ k/gcd.. ,b<=m成立
如果gcd(2n,k)==1 ,很明显 ,gcd(2m,k) >=2(因为有因子啊)
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define fi first #define se second #define all(v) v.begin(),v.end() const int N = 1e5+4; const int INF =1E9+4; const ll mod =1e9+7; ll gcd(ll a,ll b){ return b==0?a : gcd(b,a%b); } int main(){ ll n,m,k; cin>>n>>m>>k; if(2ll*m*n % k!=0){ puts("NO");return 0; } puts("YES"); ll a,b; if(gcd(2ll*n,k)>=2){ a = 2*n/gcd(2ll*n,k); b = n*m*2/a/k; } else { b = 2*m/gcd(m*2,k); a = n*m*2/k/b; } printf("0 0\n0 %lld\n%lld 0\n",b,a); return 0; }