前置知识
唯一分解定理:一个大于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;
}

京公网安备 11010502036488号