1 条题解
-
0
自动搬运
来自洛谷,原作者为

prh_rpjiajia
万语难尽涩于口 祈尔繁芜胜常春搬运于
2025-08-24 23:14:42,当前版本为作者最后更新于2025-04-26 09:02:30,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
uqd::04-26 09:26 首次发出
uqd::04-26 18:43 添加充分性证明
uqd::05-01 22:21 修改充分性证明
uqd::05-24 19:01 回答了问题场切思路
定义 函数,表示一个数的各数位之和。
必要条件:因为对于正整数 有
$$\sum{\operatorname{sd}\left(x^{\smash{2}}\right)}\equiv \left(\sum \operatorname{sd}(x)\right)^2 \pmod{9} $$, 很显然 $\sum \operatorname{sd}(x^2) \leq \left( \sum \operatorname{sd}(x) \right)^2$。
令 $d = \sum \operatorname{sd}(x),S = \sum \operatorname{sd}(x^2) = y$,则
。
反之,只要找出最小的 , 满足 ,若 , 输出
-1。否则只需从 开始,枚举至多 个 ,找到最小的 满足 。
代码:
#include <bits/stdc++.h> using namespace std; using ll = long long; ll y; int main(){ cin>>y; if(y==0){ cout<<0; return 0; } int r=y%9; if(r<0) r+=9; if(r!=0&&r!=1&&r!=4&&r!=7){ cout<<-1; return 0; } ll d0 = (ll)ceil(sqrt((long double)y)); for(ll d=d0;d<d0+9;d++){ if(d*d>=y && (d*d-y)%9==0){ cout<<d; return 0; } } cout<<-1; return 0; }充分性证明
1. 数字和与模 的同余性质
对于任意正整数 ,有:
- ,
- $\operatorname{sd}(x^2) \equiv x^2 \pmod{9} \equiv (\operatorname{sd}(x))^2 \pmod{9}$。
设 ,,则必然满足:
2. 数字和的不等式约束
由于平方运算不增加数字和(逐位平方和 和的平方):
$$\operatorname{sd}(x^2) \leq (\operatorname{sd}(x))^2 \implies y \leq d^2 $$3. 存在性构造
对任意满足 且 的 ,构造 如下:
情况1:
- 构造:取 。
- 验证:
- 当 时,,直接计算得 。
- 当 时,需调整构造(见下文)。
情况2: 且
- 构造:
- 取基础数 (保证 )。
- 通过替换部分数字为 或其他数字,使得 减少 :
- 每将一个 替换为 , 减少 ,但 减少 (因 的数字和差为 的倍数)。
- 重复替换 次即可满足 。
构造的普适性
- 模 匹配:由 ,差值 必为 的倍数,故总能通过上述调整实现。
- 下界控制:因 ,确保 恒成立。
4. 最小性保证
从 开始枚举,首个满足 的 即为最小解,因:
- 模 的周期为 ,只需检查 至 。
- 若不存在,则 ,无解。
结论
对任意 ,若存在 满足:
- ,
- ,
则必存在正整数 使得 且 。解法的充分性得证。
回答一些问题
问题1
有人问:平方运算不增加数字和,为什么qwq?
回顾数字和的定义:
对于一个正整数 ,其数字和 定义为它的十进制表示中各位数字的总和: 其中我们需要证明对于任意正整数 : $ \operatorname{sd}(x^2) \leq (\operatorname{sd}(x))^2 $
数字和具有以下重要性质:
- (数字根性质)
考虑 的各位数字 :
平方后:
$$x^2 = \left( \sum_{i=0}^{n} d_i \cdot 10^i \right)^2 = \sum_{i=0}^{n} \sum_{j=0}^{n} d_i d_j \cdot 10^{i+j} $$数字和 是这个展开式中各项的数字和之和。关键观察:
- 进位效应:当 时, 会产生进位,使得高位的数字和"压缩"
- 交叉项:交叉项 会被进位分散到不同数位
比较两种计算方式:
- 直接平方和:
- 平方后数字和: 是考虑了所有进位后的结果
由于进位会使得:
$$\operatorname{sd}(d_i d_j \cdot 10^{i+j}) \leq d_i d_j $$因此整体有:
$$\operatorname{sd}(x^2) \leq \sum_{i,j} d_i d_j = (\sum d_i)^2 $$结论:
由于平方运算中的进位效应会"压缩"数字和,因此总有: $ \operatorname{sd}(x^2) \leq (\operatorname{sd}(x))^2 $ 当且仅当 的各位数字乘积不产生进位时(如全为 的数字),等号成立。后记
感谢
https://www.luogu.com.cn/user/572587yyyhy](https://www.luogu.com.cn/user/307542)对此题解进行的问题指出,有不懂的或者有哪里我讲的不明白、不对的欢迎在评论区指出。我之后可能还会对此题解进行修改,辛苦管理员。
- 1
信息
- ID
- 11632
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者