#1571.等式的根 题解 审核通过

CPP 刷题王 2025-05-15 17:08:39 2025-05-15 17:19:52 8

解题思路

等价于

我们先拆成两个部分,一个部分是 的情况,另一部分是 的情况。

对于第一种情况直接暴力即可。因为懒得考虑边界条件。

对于第二种情况,我们先发现 是大于等于 的,而 也是大于的等于 的,所以要想 成立的充要条件是 ,所以我们只需要枚举到 即可。但是 也会超时。我们发现 远小于 (当位数为 位时 最大也就 ),所以直接从 开始枚举还是很浪费的。

我们定义 为我们从 开始枚举才能保证公式的值等于

由于 最多为 (还取不到),因此 左右。

很明显更小,所以可以不用计算。因此经过粗略计算后我们可以得到当 时是可能满足这个式子的,但前面说了这是粗算,会存在一定的误差,因此我们让 保险一些,如果更加谨慎的话 都可以取,反正又不会超时。

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;
}
{{ vote && vote.total.up }}