Find the good permutation of first N natural numbers

Given an integer N, the task is to print a good permutation of first N natural numbers. Let’s denote the ith element of the permutation be pi.
A good permutation is a permutation such that for all 1 ≤ i ≤ N the following equations hold true,

  • ppi = i
  • pi != i

Basically above expressions mean, no value is equal to its position.

If no such good permutation exists then print -1.

Examples:

Input: N = 1
Output: -1
No good permutation exists.

Input: N = 2
Output: 2 1
Position of 2 is 1 and position of 1 is 2.

Approach: Consider permutation p such that pi = i. Actually, p is a sequence of numbers from 1 to N and ppi = i.
Now the only trick is to change the permutation to satisfy the second equation i.e. pi != i. Let’s swap every two consecutive elements. More formally, for each k: 2k ≤ n let's swap p2k – 1 and p2k. It’s easy to see that the obtained permutation satisfies both the equations for every n with the only exception: when n is odd, there is no answer and we should print -1.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to print the good permutation
// of first N natural numbers
int printPermutation(int n)
{
    // If n is odd
    if (n % 2 != 0)
        cout << -1;
  
    // Otherwise
    else
        for (int i = 1; i <= n / 2; i++)
            cout << 2 * i << " " << 2 * i - 1 << " ";
}
  
// Driver code
int main()
{
    int n = 4;
    printPermutation(n);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
  
class GFG 
{
  
// Function to print the good permutation
// of first N natural numbers
static int printPermutation(int n)
{
    // If n is odd
    if (n % 2 != 0)
    {
        System.out.println("-1");
    }
  
    // Otherwise
    else
        for (int i = 1; i <= n / 2; i++)
        {
            System.out.print(2 * i + " " + ((2 * i) - 1) + " ");
        }
          
    return n;
      
}
  
// Driver code
public static void main(String []args)
{
    int n = 4;
    printPermutation(n);
}
}
  
// This code contributed by Rajput-Ji

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the approach
  
# Function to print the good permutation
# of first N natural numbers
def printPermutation(n):
      
    # If n is odd
    if (n % 2 != 0):
        print(-1);
  
    # Otherwise
    else:
        for i in range(1, (n // 2) + 1):
            print((2 * i), (2 * i - 1), end = " ");
  
# Driver code
n = 4;
printPermutation(n);
  
# This code is contributed by mits

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach
using System;
  
class GFG {
  
// Function to print the good permutation
// of first N natural numbers
static int printPermutation(int n)
{
    // If n is odd
    if (n % 2 != 0)
    {
        Console.WriteLine("-1");
    }
  
    // Otherwise
    else
        for (int i = 1; i <= n / 2; i++)
        {
            Console.WriteLine(2 * i + " " + ((2 * i) - 1) + " ");
        }
          
    return n;
      
}
  
// Driver code
public static void Main(String []args)
{
    int n = 4;
    printPermutation(n);
}
}
  
// This code is contributed by Kirti_Mangal

chevron_right


PHP

Output:

2 1 4 3


My Personal Notes arrow_drop_up

pawanasipugmailcom

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.