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; 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);
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);
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; }
|