专栏文章

做题记录 2025/6/11

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mip3nvmu
此快照首次捕获于
2025/12/03 05:38
3 个月前
此快照最后确认于
2025/12/03 05:38
3 个月前
查看原文

题意简述

给定 nn,将 2,3,,3n+12,3,\dots,3n+1 划分成 nn(ai,bi,ci)(a_i,b_i,c_i),使得每组中的三个正整数构成钝角三角形的三边长。
n105n\leq 10^5

做法

from 🐍🐍,比官解好。
观察 nn 小的情况:
n=1:(2,3,4)n=2:(2,4,5),(3,6,7)n=3:(2,5,6),(3,7,8),(4,9,10)n=1:(2,3,4)\\ n=2:(2,4,5),(3,6,7)\\ n=3:(2,5,6),(3,7,8),(4,9,10)
提出猜想:将后 2n2n 个数 n+23n+1n+2\sim 3n+1 相邻两两分组,然后依次找前 nn 个数 2 n+12~n+1 配三角形。 但当 n=4n=4 时出现 (5,12,13)(5,12,13) 不是钝角三角形。
考虑调大后 2n2n 个数的分组差,具体的选取一个 xx,得到 xx 组边长 (3n+1xi,3n+1i),i=0,1,,x1(3n+1-x-i,3n+1-i),i=0,1,\dots,x-1 然后找前 nn 个数中最大的 xx 个配三角形即:(n+1i,3n+1xi,3n+1i),i=0n1(n+1-i,3n+1-x-i,3n+1-i),i=0\sim n-1
考虑这样要满足什么条件:
  1. 三角形:(n+1i)+(3n+1xi)>3n+1i(n+1-i)+(3n+1-x-i)>3n+1-i
  2. 钝角:(n+1i)2+(3n+1xi)2<(3n+1i)2(n+1-i)^2+(3n+1-x-i)^2<(3n+1-i)^2
第一个条件取 i=n1i=n-1 限制最严,得到 xn2x\leq\lfloor\frac{n}{2}\rfloor
对于第二个条件,我们需要一个引理:
  • 对于一组钝角三角形三边长 a<b<ca<b<c,即 a+b>ca2+b2<c2a+b>c\wedge a^2+b^2<c^2,则 (a1)2+(b1)2<(c1)2(a-1)^2+(b-1)^2<(c-1)^2(不过有可能 a+b=ca+b=c)。
证明将平方展开即可。
这告诉我们第二个条件取 i=0i=0 最严,即 x(6n+2x)>(n+1i)2x(6n+2-x)>(n+1-i)^2,不难发现 x=n2x=\lfloor\frac{n}{2}\rfloorn2n\geq 2 时必然满足。
那么我们取出这 n2\lfloor\frac{n}{2}\rfloor 个三角形,记 m=nn2=n2m=n-\lfloor\frac{n}{2}\rfloor=\lceil\frac{n}{2}\rceil,则还剩下 3m3m 个数:22+m1,n+2n+1+2m2\sim2+m-1,n+2\sim n+1+2m
再有一个引理:
  • 对于一组钝角三角形三边长 a<b<ca<b<c(a,b+1,c+1)(a,b+1,c+1) 也是钝角三角形三边长。
平方差公式易证。
所以可以加强题目要求:将 2 3n+12~3n+1 分成 nn 组,每组中一个 2n+12\sim n+1 中的数、两个 n+23n+1n+2\sim 3n+1 的数,且每组都是钝角三角形三边长。
这样就可以直接递归到 23m+12\sim 3m+1 的情况,然后将 m+23m+1m+2\sim 3m+1 中的数加上 nmn-m 即可。
递归边界 n=1n=1
code:
CPP
#include <bits/stdc++.h>
int main()
{
	int n; scanf("%d", &n);
	int x = 2, y = n + 2;
	for (int m = n / 2; m; n -= m, m = n / 2)
		for (int i = 1; i <= m; i++)
			printf("%d %d %d\n", x + n - i, y + n * 2 - m - i, y + n * 2 - i);
	printf("%d %d %d\n", x, y, y + 1);
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...