[CF1515B] Phoenix and Puzzle

前言

被迫营业。

题目

CF

洛谷

题目大意:

\(t\) 组数据,每组数据输入一个整数 \(n\),表示给定的相同等腰直角三角形的数量。

询问是否能够用上所有三角形拼出一个无空洞的正方形。

能做到输出 \(\tt YES\) ,否则输出 \(\tt NO\)

\(1\le t\le 10^4;1\le n\le 10^9.\)

讲解

样例已经给我们很大的提示了:我们可以用直角边长的倍数作为正方形边长,也可以用斜边边长的倍数作为边长。

这个正方形必定是由相同的小正方形组成的,虽然很好理解,但是还是简单证明一下。

考虑反证。假设这个正方形的边长既有直角边,又有斜边。

令三角形直角边长为 \(1\),则斜边长 \(\sqrt{2}\)。令这个正方形的边长为 \(a+\sqrt{2}b\),那么面积为 \(a^2+2\sqrt{2}ab+2b^2\),是一个无理数。但是每个三角形的面积是 \(\frac{1}{2}\),是有理数,\(n\) 个拼起来也应该是有理数。与原命题不符。

  • 以直角边为边长的小正方形需要 \(2\) 个三角形。
  • 以斜边为边长的小正方形需要 \(4\) 个三角形。

正方形必定边长相等,所以小正方形个数是完全平方数。

因此只需要判断 \(\frac{n}{2}\)\(\frac{n}{4}\) 是否为完全平方数即可。

代码

bool check(double x)
{
	int t = sqrt(x);
	if(t * t == x) return 1;
	return 0;
}

int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	for(int T = Read(); T ;-- T)
	{
		n = Read();
		if(check(n/2) || check(n/4)) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}
posted @ 2021-05-03 19:23  皮皮刘  阅读(134)  评论(0编辑  收藏  举报