Codeforces 1058C(思维+最大公因数)

题面

传送门

分析

引理1:三角形的面积\(\times 2\)一定是整数
由坐标系中的三角形面积公式

\[S=\frac{1}{2}(x_1y_2+x_2y_3+x_3y_1-x_1y_3-x_2y_1-x_3y_2) \]

显然得证
故若\(\frac{2nm}{k}\)是整数,则有解,否则无解

引理2:一定能构造出一个直角边平行于坐标轴的直角三角形,使它的面积为\(\frac{nm}{k}\)
设直角三角形两直角边为\(a,b\),则\(ab=\frac{2nm}{k} \leq nm\)
由引理1,\(\frac{2nm}{k}\)为正整数,显然一定可以拆分成两正整数之积,所以一定可以找到一对正整数\((a,b)\)满足条件

根据引理1,我们来证明:
对于给定的任意正整数\(n,m,k(k \geq 2)\),一定存在一个直角三角形的两直角边长为正整数\(a,b\),且\(a,b\)满足条件$$ab=\frac{2nm}{k}$$
那么,如何构造\(a\leq n,b\leq m\)的情况呢
显然\(2n\)\(2m\)中的至少一个数与\(k\)不互质,否则\(\frac{2nm}{k}\)不可能为正整数
(1)
\(gcd(2n,k) \neq 1\),则

\[a=\frac{2n}{gcd(2n,k)},b=\frac{2nm}{ak} \]

 由于$2 \leq gcd(2n,k) \leq k$
 则$a \leq n$
 $$ b=\frac{2nm}{ak} =\frac{2nm}{\frac{2kn}{gcd(2n,k)}}=\frac{m \times gcd(2n,k)}{k} \leq \frac{mk}{k}=m $$
 故$b\leq m$

(2)
\(gcd(2n,k) = 1\),则\(a=n,b=\frac{2m}{k}\)
由于\(k \geq 2\),显然得\(b \leq m\)

综上所述,对于给定的任意正整数\(n,m,k(k \geq 2)\),一定存在一个直角三角形的两直角边长为正整数\(a,b\),且\(a,b\)满足条件\(ab=\frac{2nm}{k}\)

代码

#include<iostream>
#include<cstdio>
using namespace std;
inline long long gcd(long long a,long long b){
	return b==0?a:gcd(b,a%b);
}
long long n,m,k;
int main(){
	cin>>n>>m>>k;
	if((n*m*2)%k!=0){
		printf("NO\n");
	}else{
		printf("YES\n");
		long long S=(n*m*2)/k;
		long long a,b;
		if(gcd(n*2,k)!=1){
			a=n*2/gcd(n*2,k);
			b=S/a;
		}else{
			a=n;
			b=m*2/k;
		} 
		printf("0 0\n");
		printf("%I64d 0\n",a);
		printf("%I64d %I64d\n",a,b);
	}
} 
posted @ 2018-10-26 18:27  birchtree  阅读(232)  评论(0编辑  收藏  举报