枚举 + 二分,代码写得挫!
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> typedef __int64 LL; LL x, y, z, D, S; LL k; int main() { int i, j; while(scanf("%I64d", &k), k) { S = 0; for(D = 1; D < k / 2; D <<= 1, S ++); bool flag1, flag2; LL a, b, c; int ans = 0; for(z = 2; z <= S; z ++) { flag1 = true; for(x = 1; ; x ++) { flag2 = true; a = x; for(i = 1; i < z; i ++) { a *= x; if(a > k) { flag1 = false; break; } } //printf("%I64d\n", a); if(!flag1) break; LL l = x + 1, r = k - a; while(l <= r) { y = l + r >> 1; //printf("%I64d %I64d %I64d\n", x, y, z); b = y; for(i = 1; i < z; i ++) { b *= y; if(b >= k - a) { r = y - 1; flag2 = false; break; } } //printf("%I64d\n", b); if(a + b + (x * y * z) > k) r = y - 1; else if(a + b + (x * y * z) == k) { ans ++; break; } else l = y + 1; } } } printf("%d\n", ans); } return 0; }