题意:
给出n,求n=x^3 - y^3 的最小的(x,y);
思路:
一直想要推出公式,或者找到规律,后来看了题解,原来数论有时候也是要靠枚举的,虽然是二分枚举;
首先我们第一步把这个式子分解一下
x^3 - y^3 = (x-y)(x^2 + xy + y^2);
因为n < 10000 所以(x-y)和(x^2 + xy + y^2)也是小于10000;
因为x>y,所以(x^2 + xy + y^2) > 3y^3;
所以y的范围是0到60;
然后二分整数区间(y,y+10000)求x
#include <cstdio>
#include <cstring>
#define ll long long
int binary_search(int n, int y) {
ll l = y + 1, r = y + 10000, x, k;
while (l <= r) {
x = (l + r) / 2;
k = (x - y) * (x * x + x * y + y * y);
if (k == n) return x;
if (k < n) l = x + 1;
if (k > n) r = x - 1;
}
return -1;
}
int main() {
int n,x;
while (scanf("%d", &n) && n) {
x = -1;
for (int y = 0 ; y < 60 ; y++) {
x = binary_search(n ,y);
if (x != -1) {
printf("%d %d\n", x, y);
break;
}
}
if (x == -1)
printf("No solution\n");
}
return 0;
}