stuck

没做出来,先记录一下思路.

找 $a+b+c\le 1e7$ 的所有正整数解

首先令苹果=a,香蕉=b,菠萝=c,化简式子得到

再次化简得到

ref,可能要用椭圆曲线

https://gemini.google.com/app/3a778d7e16bdf60e

WA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
#include <cmath>
#include <numeric>
#include <set>
#include <vector>
#include <algorithm>

using namespace std;

typedef long long ll;

// 快速最大公约数
ll gcd(ll a, ll b) {
while (b) { a %= b; swap(a, b); }
return a;
}

long long res=0;
int main() {
ll limit = 10000000;
ll total_cnt = 0;
// 存储原始解 (a0, b0, c0)
set<vector<ll>> primitives;

// 预计算边界
const double s21 = sqrt(21.0);
const double s27 = sqrt(27.0);

for (ll v = 1; v <= 3500; ++v) {
ll u_min = ceil(s21 * v);
ll u_max = floor(s27 * v);

for (ll u = u_min; u <= u_max; ++u) {
if (gcd(u, v) != 1) continue;

// 共有项
ll b_base = 2 * (27 * v * v - u * u);
ll c_base = 3 * (u * u - 21 * v * v);

// 方案 1: 对应二次方程较大的根
auto add_sol = [&](ll a, ll b, ll c) {
if (a <= 0 || b <= 0 || c <= 0) return;
ll g = gcd(a, gcd(b, c));
primitives.insert({a / g, b / g, c / g});
};

add_sol(3 * (u * u + 2 * u * v - 15 * v * v), b_base, c_base);

// 方案 2: 对应二次方程较小的根 (当 u > 5v 时 x2 > 0)
if (u > 5 * v) {
add_sol(3 * (u * u - 2 * u * v - 15 * v * v), b_base, c_base);
}
}
}

// 计算所有倍数解
for (auto& sol : primitives) {
ll sum = sol[0] + sol[1] + sol[2];
if (sum <= limit) {
total_cnt ++;
res+=sum;
}
}

cout << "Total Solutions: " << total_cnt<<" "<<res << endl;

return 0;
}