# Find two numbers with given sum and maximum possible LCM

Given an integer X, the task is to find two integers A and B such that sum of these two numbers is X and the LCM of A and B is maximum.

Examples:

Input: X = 15
Output: 7 8
Explanation:
7 + 8 = 15 and LCM(7, 8) = 56 is the maximum possible.

Input: X = 30
Output: 13 17
Explanation:
13 + 17 = 30 and LCM(13, 17) = 221 is the maximum possible.

Naive Approach: The simplest approach is to use Two Pointers to find the pair of integers A and B with a given sum X and maximum possible LCM. Below are the steps:

• Initialize A and B as 1 and X1 respectively.
• Run a loop, while, A is less than and equal to B.
• At each iteration calculate the LCM of A and B, then increment A by 1 and decrement B by 1.
• Print the A and B corresponding to the maximum LCM.

Time Complexity: O(N)
Auxiliary Space: O(1)

Efficient Approach: To optimize the above naive approach the idea is to use some mathematical observations. The LCM of two co-prime integers is equal to the product of the two integers. Thus, the problem can be simplified to finding two co-prime integers A and B such that A+B = X and A×B is maximum. Below are the steps:

• If X is odd, then A = floor(X/2) and B = floor(X/2) + 1.
• Otherwise, if X is even, then
• If floor(X/2) is even, then A = floor(X/2) – 1 and B = floor(X/2) + 1.
• Otherwise, if floor(X/2) is odd, then A = floor(X/2) – 2 and B = floor(X/2) + 2.

Below is the implementation of the above approach:

## C++

 `// C++ program of the above approach` `#include ` `using` `namespace` `std;`   `// Function that print two numbers with` `// the sum X and maximum possible LCM` `void` `maxLCMWithGivenSum(``int` `X)` `{` `    ``// variables to store the result` `    ``int` `A, B;`   `    ``// If X is odd` `    ``if` `(X & 1) {` `        ``A = X / 2;` `        ``B = X / 2 + 1;` `    ``}`   `    ``// If X is even` `    ``else` `{`   `        ``// If floor(X/2) is even` `        ``if` `((X / 2) % 2 == 0) {` `            ``A = X / 2 - 1;` `            ``B = X / 2 + 1;` `        ``}`   `        ``// If floor(X/2) is odd` `        ``else` `{` `            ``A = X / 2 - 2;` `            ``B = X / 2 + 2;` `        ``}` `    ``}`   `    ``// Print the result` `    ``cout << A << ``" "` `<< B << endl;` `}`   `// Driver Code` `int` `main()` `{` `    ``// Given Number` `    ``int` `X = 30;`   `    ``// Function call` `    ``maxLCMWithGivenSum(X);` `    ``return` `0;` `}`

## Java

 `// Java program of the above approach ` `import` `java.util.*;`   `class` `GFG{`   `// Function that print two numbers with` `// the sum X and maximum possible LCM` `static` `void` `maxLCMWithGivenSum(``int` `X)` `{` `    `  `    ``// Variables to store the result` `    ``int` `A, B;`   `    ``// If X is odd` `    ``if` `((X & ``1``) == ``1``)` `    ``{` `        ``A = X / ``2``;` `        ``B = X / ``2` `+ ``1``;` `    ``}`   `    ``// If X is even` `    ``else` `    ``{` `        `  `        ``// If floor(X/2) is even` `        ``if` `((X / ``2``) % ``2` `== ``0``)` `        ``{` `            ``A = X / ``2` `- ``1``;` `            ``B = X / ``2` `+ ``1``;` `        ``}`   `        ``// If floor(X/2) is odd` `        ``else` `        ``{` `            ``A = X / ``2` `- ``2``;` `            ``B = X / ``2` `+ ``2``;` `        ``}` `    ``}` `    `  `    ``// Print the result` `    ``System.out.println(A + ``" "` `+ B); ` `}`   `// Driver code` `public` `static` `void` `main(String[] args)` `{` `    `  `    ``// Given number` `    ``int` `X = ``30``;`   `    ``// Function call` `    ``maxLCMWithGivenSum(X); ` `}` `}`   `// This code is contributed by offbeat`

## Python3

 `# Python3 program for the above approach `   `# Function that print two numbers with ` `# the sum X and maximum possible LCM ` `def` `maxLCMWithGivenSum(X):` `    `  `    ``# If X is odd ` `    ``if` `X ``%` `2` `!``=` `0``:` `        ``A ``=` `X ``/` `2` `        ``B ``=` `X ``/` `2` `+` `1` `        `  `    ``# If X is even ` `    ``else``:` `        `  `        ``# If floor(X/2) is even ` `        ``if` `(X ``/` `2``) ``%` `2` `=``=` `0``:` `            ``A ``=` `X ``/` `2` `-` `1` `            ``B ``=` `X ``/` `2` `+` `1` `            `  `        ``# If floor(X/2) is odd ` `        ``else``:` `            ``A ``=` `X ``/` `2` `-` `2` `            ``B ``=` `X ``/` `2` `+` `2` `            `  `    ``# Print the result` `    ``print``(``int``(A), ``int``(B), end ``=` `" "``)`   `# Driver Code ` `if` `__name__ ``=``=` `'__main__'``:` `    `  `    ``# Given Number` `    ``X ``=` `30` `    `  `    ``# Function call` `    ``maxLCMWithGivenSum(X)`   `# This code is contributed by virusbuddah_`

## C#

 `// C# program of the above approach ` `using` `System;` `class` `GFG{`   `// Function that print two numbers with` `// the sum X and maximum possible LCM` `static` `void` `maxLCMWithGivenSum(``int` `X)` `{` `    `  `    ``// Variables to store the result` `    ``int` `A, B;`   `    ``// If X is odd` `    ``if` `((X & 1) == 1)` `    ``{` `        ``A = X / 2;` `        ``B = X / 2 + 1;` `    ``}`   `    ``// If X is even` `    ``else` `    ``{` `        `  `        ``// If floor(X/2) is even` `        ``if` `((X / 2) % 2 == 0)` `        ``{` `            ``A = X / 2 - 1;` `            ``B = X / 2 + 1;` `        ``}`   `        ``// If floor(X/2) is odd` `        ``else` `        ``{` `            ``A = X / 2 - 2;` `            ``B = X / 2 + 2;` `        ``}` `    ``}` `    `  `    ``// Print the result` `    ``Console.WriteLine(A + ``" "` `+ B); ` `}`   `// Driver code` `public` `static` `void` `Main(String[] args)` `{` `    `  `    ``// Given number` `    ``int` `X = 30;`   `    ``// Function call` `    ``maxLCMWithGivenSum(X); ` `}` `}`   `// This code is contributed by sapnasingh4991`

Output:

```13 17

```

Time Complexity: O(1)
Auxiliary Space: O(1) My Personal Notes arrow_drop_up If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.