給定 k (k < 2^31),求正整數三元組 (x,y,z) 滿足 x^z + y^z + x*y*z = k,其中 x < y, z > 1。統計解的個數。
x^2 + y^2 + 2xy = (x+y)^2 = k。故 k 必為完全平方數,設 t = sqrt(k),則 x+y = t,滿足 xx^z + y^z + x*y*z == k 計數++。x,y 最大 ~1300,z 很小 (因指數增長),總操作數極少,極易通過。
#include <bits/stdc++.h>
using namespace std;
using int64 = long long;
const int64 INF = 0x7fffffff;
int64 ipow(int64 a, int64 e) {
int64 r = 1;
while (e) {
if (e & 1) { if (r > INF / a) return -1; r *= a; }
e >>= 1;
if (e) { if (a > INF / a) return -1; a *= a; }
}
return r;
}
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr);
int k;
while (cin >> k, k) {
int ans = 0;
int t = (int)sqrt(k);
if (t*t == k) ans += (t-1)/2; // z=2
for (int64 x=1; x*x*x < k; ++x) {
for (int64 y=x+1; y*y*y < k; ++y) {
for (int z=3;; ++z) {
int64 p1 = ipow(x, z), p2 = ipow(y, z);
if (p1==-1 || p2==-1) break;
int64 sum = p1 + p2 + x*y*z;
if (sum == k) ++ans;
if (sum >= k) break;
}
}
}
cout << ans << '\n';
}
return 0;
}