1 条题解
-
0
思路
当 时,输出 即可。下面考虑 。
从 、、 出发,可以利用平方展开式在这些数字之间插入零,再在末尾补偶数个零。这样既能保留数字多重集,又能直接证明结果仍然是完全平方数。
做法
首先输出字符串 ,随后补 个零。
然后枚举 ,每次输出两个数:
- 按顺序拼接数字 、 个零、数字 、 个零、数字 ,最后补 个零。
- 按顺序拼接数字 、 个零、数字 、 个零、数字 ,最后补 个零。
所有零的数量均非负。总共输出 个数。直接使用字符串拼接即可,不能把最长 位的数存入普通整数类型。
例如, 时,该方法可以输出 。这是一组与题面样例不同的合法答案。
正确性证明
首先证明平方性。第一项满足
对于第 次枚举,因为 ,以下展开式中各个非零十进制位互不重叠,不会产生进位:
$$\left(10^{i+1}+3\right)^2=10^{2i+2}+6\cdot10^{i+1}+9,$$$$\left(3\cdot10^{i+1}+1\right)^2=9\cdot10^{2i+2}+6\cdot10^{i+1}+1.$$两式分别给出上述两种不含末尾补零的字符串。末尾补零的数量为 ,是非负偶数。因此,补零等价于将平方根再乘 ,结果仍然是完全平方数。
其次,每个构造出的数都恰有 位,首位为 或 ,没有前导零。所有数均含有一个 、一个 、一个 和 个零,数字多重集一致。
最后,同一类别中不同 对应的三个非零数字位置不同;两种类别的首位不同。单独输出的 后补零,与首位为 的另一类在非零数字顺序上不同,也不可能与首位为 的数相同。因此所有 个数互不相同,满足题目全部要求。
部分分做法
子任务 1 可以从最小的 位整数开始,依次枚举整数。维护下一个完全平方数及其平方根:当前枚举值等于它时,记录该平方数,再递增平方根并计算下一个平方数。按十个数字的出现次数分组,某组收集到 个数时即可输出。即使采用递增维护,仍然需要经过大量非平方数。
子任务 2 可以直接枚举平方根,从 开始递增,计算平方并按数字频次分组。这样跳过了所有非平方数,显著缩小搜索量。可以使用十进制大整数完成递增和平方运算,避免有限整数类型的溢出。
这两种搜索都会找到答案:上面的构造已经给出了处于 位整数范围内的一组合法结果,因此完整枚举该范围的整数或平方根必然会遇到一组至少含 个数的相同数字多重集。更大的数据需要使用直接构造消除搜索。
复杂度
直接构造的每个测试用例需要输出 个 位数,时间复杂度为 ,与必要的输出长度同阶。本实现保存整组字符串,空间复杂度为 。一个输入文件的总输出数字数不超过 ,时间复杂度为 。
按十进制位计算大整数运算的成本,逐个整数枚举的时间上界为 ;直接枚举平方根的时间上界为 。两种搜索至多存储 个十进制位,使用数字频次数组作为哈希分组键。
- 1
信息
- ID
- 1699
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者