前置知识

唯一分解定理:一个大于1的正整数可以被表示为多个质数的乘积,一般表示为

完全平方数:注意到完全平方数可以表示为,而根据唯一分解定理,k又是可以被表示为质因子乘积,因此我们有结论:

即,一个完全平方数,每个不同质因子的幂次一定是偶数。

另外:平方数×平方数还是平方数

思路

还是唯一分解定理,有:

我们只需要把每个非偶数的次幂填到偶数,得到一个平方数(至少是他),这个平方数如果超出了R说明无解。

至此,我们至少得到了一个数,乘他能变成平方数,怎么让他变成[L,R]之间的数?我们想办法乘上一个数,让他变到里面,贪心地思考,就是,但乘上这个数就可能导致不是平方数了,我们要乘上一个数不变平方数这个性质

根据上面加粗的文字,记,然后得出 是一个平方数,并且也是也是最贴近的平方数。

#include <iostream>
#include <cmath>
#include <vector>
using namespace std;

// 质因数分解函数
vector<pair<int, int>> factorize(int x) {
    vector<pair<int, int>> factors;
    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0) {
            int cnt = 0;
            while (x % i == 0) {
                x /= i;
                cnt++;
            }
            factors.push_back({i, cnt});
        }
    }
    if (x > 1) factors.push_back({x, 1});
    return factors;
}

int main() {
    long long x, l, r;
    cin >> x >> l >> r;

    auto factors = factorize(x);
    long long y0 = 1;
    for (auto &[p, a] : factors) {
        if (a % 2 == 1) {
            y0 *= p;
        }
    }

    // 如果 y0 已经大于 r,那么无解
    if (y0 > r) {
        cout << -1 << endl;
        return 0;
    }

    long long k = ceil(sqrt((double)l / y0));
    long long y = y0 * k * k;

    if (y <= r) {
        cout << y << endl;
    } else {
        cout << -1 << endl;
    }

    return 0;
}