思路:预处理10000以内所有数的三平方和即可。
AC代码
#include <cstdio> #include <cmath> #include <algorithm> #include <cstring> #include <utility> #include <string> #include <iostream> #include <map> #include <set> #include <vector> #include <queue> #include <stack> using namespace std; #pragma comment(linker, "/STACK:1024000000,1024000000") #define eps 1e-10 #define inf 0x3f3f3f3f #define PI pair<int, int> typedef long long LL; const int maxn = 10000 + 5; int vis[maxn]; struct node{ int x, y, z; }ans[maxn]; void init() { memset(vis, 0, sizeof(vis)); for(int i = 1; i <= 100; ++i) for(int j = 1; j <= 100; ++j) for(int k = 1; k <= 100; ++k) { int sum = i*i + j*j + k*k; if(sum > 10000) continue; if(!vis[sum]) { vis[sum] = 1; ans[sum].x = i, ans[sum].y = j, ans[sum].z = k; } } } int main() { init(); int n; while(scanf("%d", &n) == 1) { printf("%d %d %d\n", ans[n].x, ans[n].y, ans[n].z); } return 0; }
如有不当之处欢迎指出!