それを行う最も速い方法は何ですか?
私の簡単なアプローチ:
for (C = 1;C<sqrt(A);C++) {
B=A/(C*(C+1));
if B is natural then add B,C to the list of possible pairs.
}
O(sqrt(A))未満で実行できますか?
解決
Egor Skriptunoff が回答したように、O(cube_root(A)) で簡単に実行できます。
これは単純な JavaScript の実装です。
function findBCs(A) {
if (A / 2 != Math.floor(A / 2)) return [];
var solution = [];
var i;
var SR3 = Math.pow(A, 1 / 3);
for (i = 1; i <= SR3; i++) {
var B, C;
C = i;
B = A / (C * (C + 1));
if (B == Math.floor(B)) {
solution.push([B, C]);
}
B = i;
C = (-1 + Math.sqrt(1 + 4 * A / B)) / 2;
if (C == Math.floor(C)) {
solution.push([B, C]);
}
}
return solution;
}
それはより良いはずなので、私はMehの答えを受け入れます(その実装はもう少し複雑で、私はテストしていません)。