Given a callable function f(x, y)with a hidden formula and a value z, reverse engineer the formula and return all positive integer pairsxandywheref(x,y) == z. You may return the pairs in any order.
While the exact formula is hidden, the function is monotonically increasing, i.e.:
f(x, y) < f(x + 1, y)
f(x, y) < f(x, y + 1)
The function interface is defined like this:
interface CustomFunction { public: // Returns some positive integer f(x, y) for two positive integers x and y based on a formula.
int f(int x, int y); };
We will judge your solution as follows:
The judge has a list of 9 hidden implementations of CustomFunction, along with a way to generate an answer key of all valid pairs for a specific z.
The judge will receive two inputs: a function_id (to determine which implementation to test your code with), and the target z.
The judge will call your findSolution and compare your results with the answer key.
If your results match the answer key , your solution will be Accepted.
Input: function_id =1, z =5Output: [[1,4],[2,3],[3,2],[4,1]]Explanation: The hidden formula for function_id =1isf(x, y)= x + y.The following positive integer values of x and y make f(x, y) equal to 5:x=1, y=4-> f(1,4)=1+4=5.x=2, y=3-> f(2,3)=2+3=5.x=3, y=2-> f(3,2)=3+2=5.x=4, y=1-> f(4,1)=4+1=5.
Input: function_id =2, z =5Output: [[1,5],[5,1]]Explanation: The hidden formula for function_id =2isf(x, y)= x * y.The following positive integer values of x and y make f(x, y) equal to 5:x=1, y=5-> f(1,5)=1*5=5.x=5, y=1-> f(5,1)=5*1=5.
Since f(x, y) is monotonically increasing in both x and y, we can efficiently search for all solutions by fixing one variable and searching for the other using two pointers or binary search.
classSolution {
public: vector<vector<int>> findSolution(CustomFunction& f, int z) {
vector<vector<int>> ans;
for (int x =1; x <=1000; ++x) {
int l =1, r =1000;
while (l <= r) {
int y = l + (r - l) /2;
int val = f.f(x, y);
if (val == z) {
ans.push_back({x, y});
break;
} elseif (val < z) {
l = y +1;
} else {
r = y -1;
}
}
}
return ans;
}
};
classSolution {
public List<List<Integer>>findSolution(CustomFunction f, int z) {
List<List<Integer>> ans =new ArrayList<>();
for (int x = 1; x <= 1000; x++) {
int l = 1, r = 1000;
while (l <= r) {
int y = l + (r - l) / 2;
int val = f.f(x, y);
if (val == z) {
ans.add(List.of(x, y));
break;
} elseif (val < z) {
l = y + 1;
} else {
r = y - 1;
}
}
}
return ans;
}
}
classSolution {
funfindSolution(f: CustomFunction, z: Int): List<List<Int>> {
val ans = mutableListOf<List<Int>>()
for (x in1..1000) {
var l = 1var r = 1000while (l <= r) {
val y = l + (r - l) / 2val valf = f.f(x, y)
if (valf == z) {
ans.add(listOf(x, y))
break } elseif (valf < z) {
l = y + 1 } else {
r = y - 1 }
}
}
return ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
classSolution:
deffindSolution(self, f: 'CustomFunction', z: int) -> list[list[int]]:
ans = []
for x in range(1, 1001):
l, r =1, 1000while l <= r:
y = (l + r) //2 val = f.f(x, y)
if val == z:
ans.append([x, y])
breakelif val < z:
l = y +1else:
r = y -1return ans
impl Solution {
pubfnfind_solution(f: &CustomFunction, z: i32) -> Vec<Vec<i32>> {
letmut ans =vec![];
for x in1..=1000 {
let (mut l, mut r) = (1, 1000);
while l <= r {
let y = l + (r - l) /2;
let val = f.f(x, y);
if val == z {
ans.push(vec![x, y]);
break;
} elseif val < z {
l = y +1;
} else {
r = y -1;
}
}
}
ans
}
}