Title

Vasya and Triangle题解

原题链接

题目翻译:给定\(n,m,k\),让你求出三个整点\(A(x1,y1),B(x2,y2),C(x3,y3)\),其中\(0 \le x1,x2,x3 \le n\)\(0 \le y1,y2,y3 \le m\)\(S_{\triangle ABC}=\frac{nm}k\)
数据范围:\(1 \le n,m \le 10^9\)\(2 \le k \le 10^9\)

我们发现,一个整点三角形的面积的两倍一定是一个整数,因此 \(k \nmid 2nm\) 时就一定无解,否则就有解。

我们考虑在平面上选取三个点 \(A(0,0),B(0,a),C(b,0)\),那么 \(a \times b =\frac{2nm}k\)

  • \(k\)是个偶数的时候, \(\large \frac{2nm}k=\frac{nm}{\frac k 2}\),然后枚举 \(\frac k 2\) 的质因数,能除到\(n\)下面的除到\(n\),否则就除到\(m\)下面,最终得到的 \(n,m\) 就作为 \(b,a\) 输出。
    证明可行性:由于 \(\frac{2nm}k\) 一定是一个整数,所以 \(\frac k 2\) 一定能分到 \(n\)\(m\) 下。

  • \(k\) 是个奇数的时候,直接枚举\(k\)的质因数,然后按照上面的方法分别除到 \(n\)\(m\) 的下面,处理完\(k\)后还要处理那个2,如果此时的 \(n\)\(2\) 不超过限制就使得 \(n\) 变成 \(n \times 2\),否则就给 \(m\)\(2\),输出同上。
    证明可行性:由于 \(\frac{2nm}k\) 一定是一个整数,且\(k\)是个奇数,所有 \(\frac{nm}k\) 也一定是一个整数,所以 \(k\) 一定能分下去,然后由于 \(k \ge 2\),所以最后 \(n\)\(m\) 之间必定有一个能够乘 \(2\) 的。

Code:

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	int N=n,M=m;
	if(2ll*n*m%k!=0)
		return puts("NO")&0;
	puts("YES");
	int ok=1;
	if(k%2==0)
		k/=2,ok=0;
	long long S=2ll*n*m/k;
	for(int i=2;i*i<=k;i++)
		while(k%i==0)
		{
			if(n%i==0)
				n/=i;
			else
				m/=i;
			k/=i;
		}
	if(n%k==0)
		n/=k;
	else
		m/=k;
	if(ok)
	{
		if(n*2<=N)
			n*=2;
		else
			m*=2;
	}
	printf("0 0\n0 %d\n%d 0\n",m,n);
	
	return 0;
}
posted @ 2022-01-02 16:06  五百年前  阅读(24)  评论(0编辑  收藏  举报