04 关于奇数的等式
题目分析/解题思路
暴力枚举 x, y, z 的话我们的时间复杂度为 O(m^3/8),这个时间复杂度有些紧张,我们考虑变换原式来降低时间复杂度。
所以我们可以发现我们只需要枚举前两个数即可,现在算法的时间复杂度为O(m^2/4)。
代码:
#include <bits/stdc++.h>
using namespace std;
tuple<int, int, int> f(int n, int m) {
for (int i = 1; i <= m; i += 2)
for (int j = i + 2; j <= m; j += 2) {
int x = i * j * n;
int y = 3 * i * j - n * (i + j);
if (x % y) continue;
int k = x / y;
if (k > m or k <= j) continue;
return {i, j, k};
}
return {0, 0, 0};
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n, m;
cin >> n >> m;
auto [x, y, z] = f(n, m);
if (x > 0)
cout << x << ' ' << y << ' ' << z << '\n';
else
cout << "No solution in (3, " << m << "].\n";
return 0;
}