#include using namespace std; using ll = long long; // This is an implementation of Paul's solution as described in the README. struct pt { ll v[3]; }; // The two special cases. vector r5 = vector{pt{0,0,0}, pt{0,0,1}, pt{0,1,0}, pt{1,0,0}}; vector r23 = vector{ // Trial and error find. pt{0,0,2}, pt{2,0,0}, pt{0,2,0}, pt{1,0,2}, pt{2,1,2}, pt{2,0,1}, pt{0,2,2}, pt{1,2,2}, pt{2,1,2}}; void sort(ll &a, ll &b, ll &c) { if (a > b) swap(a, b); if (b > c) swap(b, c); if (a > b) swap(a, b); } void tetra_corner(vector& pts, ll cx, ll cy, ll cz, ll rx, ll ry, ll rz) { pts.push_back(pt{cx ? cx - rx : rx, cy, cz}); pts.push_back(pt{cx, cy ? cy - ry : ry, cz}); pts.push_back(pt{cx, cy, cz ? cz - rz : rz}); } struct Option { ll prod, x, y, z; }; vector