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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to split N natural numbers
// into two sets having GCD
// of their sums greater than 1
 
#include <bits/stdc++.h>
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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to split N natural numbers
// into two sets having GCD
// of their sums greater than 1
 
#include <bits/stdc++.h>
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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Output: 

4
1 2 3 5 6 7



 

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

competitive-programming-img




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.