# Split N natural numbers into two sets having GCD of their sums greater than 1

Given an integer N, the task is to create two sets of distinct elements from 1 to N such that the gcd of their respective sums is greater than 1. Print the respective sets. If no such split can be done, print -1.
Examples:

Input: N = 5
Output:
2 4
1 3 5
Explanation:
GCD(Sum({2, 4}), Sum({1, 3, 5}) = GCD(6, 9) = 3

Input: N = 2
Output: -1
Explanation:
For N = 2, it is not possible to divide into two sets having GCD of their sum greater than 1.

Approach 1: A simple approach is to split all even numbers up to N into one set and all odd numbers into another set.
Below code is the implementation of the approach:

## C++

 `// C++ program to split N natural numbers ` `// into two sets having GCD ` `// of their sums greater than 1 ` ` `  `#include ` `using` `namespace` `std; ` ` `  `// Function to create ` `// and print the two sets ` `void` `createSets(``int` `N) ` `{ ` `    ``// No such split ` `    ``// possible for N <= 2 ` `    ``if` `(N <= 2) { ` `        ``cout << ``"-1"` `<< endl; ` `        ``return``; ` `    ``} ` ` `  `    ``// Print the first set ` `    ``// consisting of even elements ` `    ``for` `(``int` `i = 2; i <= N; i += 2) ` `        ``cout << i << ``" "``; ` `    ``cout << ``"\n"``; ` `    ``// Print the second set ` `    ``// consisting of odd ones ` `    ``for` `(``int` `i = 1; i <= N; i += 2) { ` `        ``cout << i << ``" "``; ` `    ``} ` `} ` `// Driver Code ` `int` `main() ` `{ ` ` `  `    ``int` `N = 6; ` `    ``createSets(N); ` ` `  `    ``return` `0; ` `} `

## Java

 `// Java program to split N natural numbers ` `// into two sets having GCD ` `// of their sums greater than 1 ` `class` `GFG{ ` `   `  `// Function to create ` `// and print the two sets ` `static` `void` `createSets(``int` `N) ` `{ ` `    ``// No such split ` `    ``// possible for N <= 2 ` `    ``if` `(N <= ``2``) ` `    ``{ ` `        ``System.out.println(``"-1"` `); ` `        ``return``; ` `    ``} ` ` `  `    ``// Print the first set ` `    ``// consisting of even elements ` `    ``for` `(``int` `i = ``2``; i <= N; i += ``2``) ` `        ``System.out.print(i + ``" "``); ` `    ``System.out.print(``"\n"``) ; ` `   `  `    ``// Print the second set ` `    ``// consisting of odd ones ` `    ``for` `(``int` `i = ``1``; i <= N; i += ``2``)  ` `    ``{ ` `        ``System.out.print(i + ``" "``); ` `    ``} ` `} ` `// Driver Code ` `public` `static` `void` `main(String[] args) ` `{ ` ` `  `    ``int` `N = ``6``; ` `    ``createSets(N); ` `} ` `} ` ` `  `// This code is contributed by shivanisinghss2110`

## Python3

 `# Python3 program to split N natural numbers ` `# into two sets having GCD ` `# of their sums greater than 1 ` ` `  `# Function to create ` `# and prthe two sets ` `def` `createSets(N): ` `   `  `    ``# No such split ` `    ``# possible for N <= 2 ` `    ``if` `(N <``=` `2``): ` `        ``print``(``"-1"``); ` `        ``return``; ` ` `  `    ``# Prthe first set ` `    ``# consisting of even elements ` `    ``for` `i ``in` `range``(``2``, N ``+` `1``, ``2``): ` `        ``print``(i, end``=``" "``); ` `    ``print``(""); ` ` `  `    ``# Prthe second set ` `    ``# consisting of odd ones ` `    ``for` `i ``in` `range``(``1``, N ``+` `1``, ``2``): ` `        ``print``(i, end ``=` `" "``); ` ` `  `# Driver Code ` `if` `__name__ ``=``=` `'__main__'``: ` `    ``N ``=` `6``; ` `    ``createSets(N); ` ` `  `# This code is contributed by gauravrajput1`

## C#

 `// C# program to split N natural numbers ` `// into two sets having GCD ` `// of their sums greater than 1 ` `using` `System; ` `class` `GFG{ ` ` `  `// Function to create ` `// and print the two sets ` `static` `void` `createSets(``int` `N) ` `{ ` `    ``// No such split ` `    ``// possible for N <= 2 ` `    ``if` `(N <= 2) ` `    ``{ ` `        ``Console.WriteLine(``"-1"` `); ` `        ``return``; ` `    ``} ` ` `  `    ``// Print the first set ` `    ``// consisting of even elements ` `    ``for` `(``int` `i = 2; i <= N; i += 2) ` `        ``Console.Write(i + ``" "``); ` `    ``Console.Write(``"\n"``) ; ` ` `  `    ``// Print the second set ` `    ``// consisting of odd ones ` `    ``for` `(``int` `i = 1; i <= N; i += 2)  ` `    ``{ ` `        ``Console.Write(i + ``" "``); ` `    ``} ` `} ` `// Driver Code ` `public` `static` `void` `Main(String[] args) ` `{ ` ` `  `    ``int` `N = 6; ` `    ``createSets(N); ` `} ` `} ` ` `  `// This code is contributed by shivanisinghss2110`

Output:

```2 4 6
1 3 5
```

Approach 2: This approach can be divided into 2 cases based on N:

1. If N is odd:
• The sum of N natural numbers is divisible by (N+1)/2 in this case.
• Therefore we only need to put (N+1)/2 into first set and the remaining numbers into second set.
• This will automatically make the GCD of their sums greater than 1.
2. If N is even:
• The sum of N natural numbers is divisible by N/2 in this case.
• Therefore we only need to put N/2 into first set and the remaining numbers into second set.
• This will automatically make the GCD of their sums greater than 1.

Below is the implementation of the above approach:

## C++

 `// C++ program to split N natural numbers ` `// into two sets having GCD ` `// of their sums greater than 1 ` ` `  `#include ` `using` `namespace` `std; ` ` `  `#define ll long long ` ` `  `// Function to create ` `// and print the two sets ` `void` `createSets(ll n) ` `{ ` `    ``// For n <= 2 such sets ` `    ``// can never be formed ` `    ``if` `(n <= 2) { ` `        ``cout << ``"-1"``; ` `        ``return``; ` `    ``} ` ` `  `    ``else` `{ ` ` `  `        ``// Check if N is even or odd ` `        ``// and store the element ` `        ``// which divides the sum of N ` `        ``// natural numbers accordingly ` `        ``ll x = (n % 2 == 0) ? (n / 2) ` `                            ``: ((n + 1) / 2); ` ` `  `        ``// First set ` `        ``cout << x << endl; ` ` `  `        ``// Print elements of second set ` `        ``for` `(ll i = 1; i <= n; i++) { ` ` `  `            ``if` `(i == x) ` `                ``continue``; ` ` `  `            ``cout << i << ``" "``; ` `        ``} ` `    ``} ` `    ``return``; ` `} ` ` `  `// Driver code ` `int` `main() ` `{ ` `    ``ll N = 7; ` ` `  `    ``createSets(N); ` ` `  `    ``return` `0; ` `} `

## Java

 `// Java program to split N natural numbers ` `// into two sets having GCD ` `// of their sums greater than 1 ` `class` `GFG{ ` ` `  `// Function to create ` `// and print the two sets ` `static` `void` `createSets(``long` `n) ` `{ ` `     `  `    ``// For n <= 2 such sets ` `    ``// can never be formed ` `    ``if` `(n <= ``2``) ` `    ``{ ` `        ``System.out.print(``"-1"``); ` `        ``return``; ` `    ``} ` `    ``else` `    ``{ ` `         `  `        ``// Check if N is even or odd ` `        ``// and store the element ` `        ``// which divides the sum of N ` `        ``// natural numbers accordingly ` `        ``long` `x = (n % ``2` `== ``0``) ? (n / ``2``) : ` `                          ``((n + ``1``) / ``2``); ` ` `  `        ``// First set ` `        ``System.out.print(x + ``"\n"``); ` ` `  `        ``// Print elements of second set ` `        ``for``(``int` `i = ``1``; i <= n; i++) ` `        ``{ ` `            ``if` `(i == x) ` `                ``continue``; ` ` `  `            ``System.out.print(i + ``" "``); ` `        ``} ` `    ``} ` `    ``return``; ` `} ` ` `  `// Driver code ` `public` `static` `void` `main(String[] args) ` `{ ` `    ``long` `N = ``7``; ` ` `  `    ``createSets(N); ` `} ` `} ` ` `  `// This code is contributed by PrinciRaj1992 `

## Python3

 `# Python3 program to split N natural numbers ` `# into two sets having GCD ` `# of their sums greater than 1 ` ` `  `# Function to create ` `# and prthe two sets ` `def` `createSets(n): ` `     `  `    ``# For n <= 2 such sets ` `    ``# can never be formed ` `    ``if` `(n <``=` `2``): ` `        ``print``(``"-1"``); ` `        ``return``; ` `    ``else``: ` ` `  `        ``# Check if N is even or odd ` `        ``# and store the element ` `        ``# which divides the sum of N ` `        ``# natural numbers accordingly ` `        ``x ``=` `(n ``/``/` `2``) ``if``(n ``%` `2` `=``=` `0``) ``else` `( ` `            ``(n ``+` `1``) ``/``/` `2``); ` ` `  `        ``# First set ` `        ``print``(x, ``" "``); ` ` `  `        ``# Prelements of second set ` `        ``for` `i ``in` `range``(``1``, n ``+` `1``): ` `            ``if` `(i ``=``=` `x): ` `                ``continue``; ` ` `  `            ``print``(i, end ``=` `" "``); ` ` `  `    ``return``; ` ` `  `# Driver code ` `if` `__name__ ``=``=` `'__main__'``: ` `     `  `    ``N ``=` `7``; ` ` `  `    ``createSets(N); ` ` `  `# This code is contributed by 29AjayKumar `

## C#

 `// C# program to split N natural numbers ` `// into two sets having GCD ` `// of their sums greater than 1 ` `using` `System; ` `class` `GFG{ ` ` `  `// Function to create ` `// and print the two sets ` `static` `void` `createSets(``long` `n) ` `{ ` `     `  `    ``// For n <= 2 such sets ` `    ``// can never be formed ` `    ``if` `(n <= 2) ` `    ``{ ` `        ``Console.Write(``"-1"``); ` `        ``return``; ` `    ``} ` `    ``else` `    ``{ ` `         `  `        ``// Check if N is even or odd ` `        ``// and store the element ` `        ``// which divides the sum of N ` `        ``// natural numbers accordingly ` `        ``long` `x = (n % 2 == 0) ? (n / 2) : ` `                          ``((n + 1) / 2); ` ` `  `        ``// First set ` `        ``Console.Write(x + ``"\n"``); ` ` `  `        ``// Print elements of second set ` `        ``for``(``int` `i = 1; i <= n; i++) ` `        ``{ ` `            ``if` `(i == x) ` `                ``continue``; ` ` `  `            ``Console.Write(i + ``" "``); ` `        ``} ` `    ``} ` `    ``return``; ` `} ` ` `  `// Driver code ` `public` `static` `void` `Main(String[] args) ` `{ ` `    ``long` `N = 7; ` ` `  `    ``createSets(N); ` `} ` `} ` ` `  `// This code is contributed by sapnasingh4991`

Output:

```4
1 2 3 5 6 7
```

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

My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

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.