1 条题解

  • 0
    @ 2025-10-22 17:18:11

    题目分析

    我们有一个序列: an=k+n2,n0 a_n = k + n^2, \quad n \ge 0 我们要找最小的非负整数 mm,使得存在某个 n0n \ge 0 满足: k+n2=m2 k + n^2 = m^2 即: m2n2=k m^2 - n^2 = k (mn)(m+n)=k (m - n)(m + n) = k

    d=mnd = m - n,则 m+n=k/dm + n = k / d,于是: $ m = \frac{k/d + d}{2}, \quad n = \frac{k/d - d}{2} $ 要求:

    1. dd 整除 kk
    2. k/ddk/d \ge d(保证 n0n \ge 0
    3. k/dk/ddd 同奇偶(保证 m,nm, n 为整数)

    特殊情况

    • k0k \ge 0 时,只需枚举 dd11k\lfloor \sqrt{k} \rfloor
    • k<0k < 0 时,令 t=kt = -k,方程变为: n2m2=t n^2 - m^2 = t d=nmd = n - m,则 n+m=t/dn + m = t / d,于是: m=t/dd2 m = \frac{t/d - d}{2} 要求 t/ddt/d \ge d 且同奇偶。

    C++ 代码

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    int main() {
        long long k;
        cin >> k;
    
        if (k >= 0) {
            long long ans = -1;
            for (long long d = 1; d * d <= k; d++) {
                if (k % d == 0) {
                    long long y = k / d;
                    if ((y + d) % 2 == 0) {
                        long long m = (y + d) / 2;
                        if (ans == -1 || m < ans) {
                            ans = m;
                        }
                    }
                }
            }
            if (ans != -1) {
                cout << ans * ans << endl;
            } else {
                cout << "none" << endl;
            }
        } else {
            long long t = -k;
            long long ans = -1;
            for (long long d = 1; d * d <= t; d++) {
                if (t % d == 0) {
                    long long y = t / d;
                    if ((y + d) % 2 == 0) {
                        long long m = (y - d) / 2;
                        if (m >= 0 && (ans == -1 || m < ans)) {
                            ans = m;
                        }
                    }
                }
            }
            if (ans != -1) {
                cout << ans * ans << endl;
            } else {
                cout << "none" << endl;
            }
        }
    
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(k)O(\sqrt{|k|}),对于 k1012k \le 10^{12} 是可行的。
    • 空间复杂度:O(1)O(1)

    样例验证

    1. 输入 0 → 输出 0
    2. 输入 -5 → 输出 4
    3. 输入 2 → 输出 none
    • 1

    信息

    ID
    3533
    时间
    3000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者