解题思路
等价于 。
我们先拆成两个部分,一个部分是 的情况,另一部分是 的情况。
对于第一种情况直接暴力即可。因为懒得考虑边界条件。
对于第二种情况,我们先发现 是大于等于 的,而 也是大于的等于 的,所以要想 成立的充要条件是 ,所以我们只需要枚举到 即可。但是 也会超时。我们发现 远小于 (当位数为 位时 最大也就 ),所以直接从 开始枚举还是很浪费的。
我们定义 为我们从 开始枚举才能保证公式的值等于 。
由于 最多为 (还取不到),因此 为 左右。
很明显更小,所以可以不用计算。因此经过粗略计算后我们可以得到当 为 时是可能满足这个式子的,但前面说了这是粗算,会存在一定的误差,因此我们让 保险一些,如果更加谨慎的话 都可以取,反正又不会超时。
CODE:
inline int s(int n) {
int ans = 0;
while (n) {
ans += n % 10;
n /= 10;
}
return ans;
}
signed main() {
ios::sync_with_stdio(false);
ios_base::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int n;
cin >> n;
int t = sqrtl(n);
for (int i = 1; i <= 1000; i++) {
if (i * i + i * s(i) == n) {
cout << i;
return 0;
}
}
for (int i = t - /*29 ~ 6 \times 10^7 都能过*/; i * i <= n; i++) {
if (i + s(i) == n * 1.0 / i) {
cout << i;
return 0;
}
}
cout << -1;
return 0;
}