最近开了下脑洞编了一道题,分享给大伙看看
S(N) 表示 N 的数位和,举例:S(1234) = 1+2+3+4 = 10
令整数 K = N + S(N) + S(S(N)),给出固定 K 值,求出所有使等式成立的正整数 N
解法一
提供一下个人解法
本题如果在不做任何处理的情况下直接暴力搜索,会发现搜索区间很大
于是从缩小搜索区间入手
变形一下
N=K−S(N)−S(S(N))(1)
根据
S(N)+S(S(N))>0
找出上界
N<K(2)
定义 p(x) 为 x 的位数,p(1234)=4
接下来从位数出发,那么有
S(N)⩽S(i=0∑i<p(N)9⋅10i)
例
S(1234)⩽S(9999)
定义
Smax(N)=S(i=0∑i<p(N)9⋅10i)
于是有
S(N)⩽Smax(N)⩽Smax(K)(3)
代入(1)中
N⩾K−Smax(K)−S(Smax(K))
最后
K−Smax(K)−S(Smax(K))⩽N⩽K(4)
就是 N 的搜索范围
整个搜索范围的长度只有 L=Smax(K)+S(Smax(K))
时间复杂度 O(L)=O(log10K)
其实放缩的还不够细,有耐心讨论的话,根据 K 可以找到更小更精确的上界,比如S(1234)<S(999)<S(9999)
本题也许还有其他思路,朋友说把 N 和 K 的函数画出图的话,整体是波动上升的,利用这个性质也许会有其他解法