题解:P12334 注视
prh_rpjiajia · · 题解
uqd::04-26 09:26 首次发出\ uqd::04-26 18:43 添加充分性证明\ uqd::05-01 22:21 修改充分性证明\ uqd::05-24 19:01 回答了问题
场切思路
定义
必要条件:因为对于正整数
,
很显然
令
。
反之,只要找出最小的 -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. 数字和与模 9 的同余性质
对于任意正整数
设
2. 数字和的不等式约束
由于平方运算不增加数字和(逐位平方和
3. 存在性构造
对任意满足
情况1:y = d^2
- 构造:取
x = \underbrace{11\cdots1}_{d\text{个}} 。 - 验证:
- 当
d \leq 9 时,x^2 = \underbrace{12\cdots321}_{\text{对称数}} ,直接计算得\operatorname{sd}(x^2) = d^2 。 - 当
d > 9 时,需调整构造(见下文)。
- 当
情况2:y < d^2 且 d^2 - y = 9k
- 构造:
- 取基础数
x' = \underbrace{11\cdots1}_{d\text{个}} (保证\operatorname{sd}(x') = d )。 - 通过替换部分数字为
0 或其他数字,使得\operatorname{sd}(x'^2) 减少9k :- 每将一个
1 替换为0 ,\operatorname{sd}(x') 减少1 ,但\operatorname{sd}(x'^2) 减少9 (因1110^2 - 1111^2 的数字和差为9 的倍数)。 - 重复替换
k 次即可满足\operatorname{sd}(x^2) = y 。
- 每将一个
- 取基础数
构造的普适性
- 模
9 匹配:由d^2 \equiv y \pmod{9} ,差值d^2 - y 必为9 的倍数,故总能通过上述调整实现。 - 下界控制:因
d \geq \lceil \sqrt{y} \rceil ,确保d^2 \geq y 恒成立。
4. 最小性保证
从
- 模
9 的周期为9 ,只需检查d_0 至d_0 + 8 。 - 若不存在,则
y \bmod 9 \notin \{0,1,4,7\} ,无解。
结论
对任意
则必存在正整数
回答一些问题
问题1
有人问:平方运算不增加数字和,为什么qwq?
回顾数字和的定义:\
对于一个正整数
我们需要证明对于任意正整数
数字和具有以下重要性质:
-
\operatorname{sd}(x) \leq 9 \cdot \text{位数}(x) -
考虑
平方后:
数字和
- 进位效应:当
i+j \geq 1 时,10^{i+j} 会产生进位,使得高位的数字和"压缩" - 交叉项:交叉项
2d_i d_j 会被进位分散到不同数位
比较两种计算方式:
- 直接平方和:
(\sum d_i)^2 = \sum d_i^2 + 2\sum_{i<j} d_i d_j - 平方后数字和:
\operatorname{sd}(x^2) 是考虑了所有进位后的结果
由于进位会使得:
因此整体有:
结论:\ 由于平方运算中的进位效应会"压缩"数字和,因此总有:
当且仅当
后记
感谢@cmrhhh和@yyyhy对此题解进行的问题指出,有不懂的或者有哪里我讲的不明白、不对的欢迎在评论区指出。
我之后可能还会对此题解进行修改,辛苦管理员。