Codeforces 1058C(思維+最大公因數)

題面

傳送門

分析

引理1:三角形的面積×2\times 2一定是整數
由座標系中的三角形面積公式
S=12(x1y2+x2y3+x3y1x1y3x2y1x3y2)S=\frac{1}{2}(x_1y_2+x_2y_3+x_3y_1-x_1y_3-x_2y_1-x_3y_2)
顯然得證
故若2nmk\frac{2nm}{k}是整數,則有解,否則無解

引理2:一定能構造出一個直角邊平行於座標軸的直角三角形,使它的面積爲nmk\frac{nm}{k}
設直角三角形兩直角邊爲a,ba,b
ab=2nmknmab=\frac{2nm}{k} \leq nm
由引理12nmk\frac{2nm}{k}爲正整數,所以一定可以找到一對正整數(a,b)(a,b)滿足條件

那麼,如何構造an,bma\leq n,b\leq m的情況呢
顯然2n2n2m2mkk不互質
(1)若gcd(2n,k)1gcd(2n,k) \neq 1,則a=2ngcd(2n,k),b=2nmaka=\frac{2n}{gcd(2n,k)},b=\frac{2nm}{ak}
由於2gcd(2n,k)k2 \leq gcd(2n,k) \leq k
ana \leq n
b=2nmak=2nm2kngcd(2n,k)b=\frac{2nm}{ak} =\frac{2nm}{\frac{2kn}{gcd(2n,k)}}=m×gcd(2n,k)kmkk=m\frac{m \times gcd(2n,k)}{k} \leq \frac{mk}{k}=m
(2)若gcd(2n,k)=1gcd(2n,k) = 1,則a=n,b=2mka=n,b=\frac{2m}{k}
由於k2k \geq 2,bmb \leq m

代碼

#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);
	}
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章