Permutation of first N positive integers such that prime numbers are at prime indices | Set 2
Last Updated :
15 Nov, 2021
Given an integer N, the task is to find the number of permutations of first N positive integers such that prime numbers are at prime indices (for 1-based indexing).
Note: Since, the number of ways may be very large, return the answer modulo 109 + 7.
Examples:
Input: N = 3
Output: 2
Explanation:
Possible permutation of first 3 positive integers, such that prime numbers are at prime indices are: {1, 2, 3}, {1, 3, 2}
Input: N = 5
Output: 12
Approach: Using Sieve of Eratosthenes
- First, count all the primes between 1 to N using Sieve of Eratosthenes.
- Next, iterate over each position and get the count of prime positions, call it k.
- So, for the k prime numbers, we have limited choice, we need to arrange them in k prime spots.
- For the n-k non-prime numbers, we also have limited choice. We need to arrange them in n-k non-prime spots.
- Both the events are independent, so the total ways would be the product of them.
- Number of ways to arrange k objects in k boxes is k!
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
static const int MOD = 1e9 + 7;
int numPrimeArrangements( int n)
{
vector< bool > prime(n + 1, true );
prime[0] = false ;
prime[1] = false ;
for ( int i = 2; i <= sqrt (n); i++) {
if (prime[i])
for ( int factor = 2;
factor * i <= n;
factor++)
prime[factor * i] = false ;
}
int primeIndices = 0;
for ( int i = 1; i <= n; i++)
if (prime[i])
primeIndices++;
int mod = 1e9 + 7, res = 1;
for ( int i = 1; i <= primeIndices; i++)
res = (1LL * res * i) % mod;
for ( int i = 1; i <= (n - primeIndices); i++)
res = (1LL * res * i) % mod;
return res;
}
int main()
{
int N = 5;
cout << numPrimeArrangements(N);
return 0;
}
|
Java
import java.util.*;
class GFG{
static int MOD = ( int ) (1e9 + 7 );
static int numPrimeArrangements( int n)
{
boolean []prime = new boolean [n + 1 ];
Arrays.fill(prime, true );
prime[ 0 ] = false ;
prime[ 1 ] = false ;
for ( int i = 2 ; i <= Math.sqrt(n); i++) {
if (prime[i])
for ( int factor = 2 ;
factor * i <= n;
factor++)
prime[factor * i] = false ;
}
int primeIndices = 0 ;
for ( int i = 1 ; i <= n; i++)
if (prime[i])
primeIndices++;
int mod = ( int ) (1e9 + 7 ), res = 1 ;
for ( int i = 1 ; i <= primeIndices; i++)
res = ( int ) ((1L * res * i) % mod);
for ( int i = 1 ; i <= (n - primeIndices); i++)
res = ( int ) ((1L * res * i) % mod);
return res;
}
public static void main(String[] args)
{
int N = 5 ;
System.out.print(numPrimeArrangements(N));
}
}
|
Python3
import math;
def numPrimeArrangements(n):
prime = [ True for i in range (n + 1 )]
prime[ 0 ] = False
prime[ 1 ] = False
for i in range ( 2 , int (math.sqrt(n)) + 1 ):
if prime[i]:
factor = 2
while factor * i < = n:
prime[factor * i] = False
factor + = 1
primeIndices = 0
for i in range ( 1 , n + 1 ):
if prime[i]:
primeIndices + = 1
mod = 1000000007
res = 1
for i in range ( 1 , primeIndices + 1 ):
res = (res * i) % mod
for i in range ( 1 , n - primeIndices + 1 ):
res = (res * i) % mod
return res
if __name__ = = '__main__' :
N = 5
print (numPrimeArrangements(N))
|
C#
using System;
class GFG{
static int numPrimeArrangements( int n)
{
bool []prime = new bool [n + 1];
for ( int i = 0; i < prime.Length; i++)
prime[i] = true ;
prime[0] = false ;
prime[1] = false ;
for ( int i = 2; i <= Math.Sqrt(n); i++)
{
if (prime[i])
{
for ( int factor = 2;
factor * i <= n;
factor++)
prime[factor * i] = false ;
}
}
int primeIndices = 0;
for ( int i = 1; i <= n; i++)
if (prime[i])
primeIndices++;
int mod = ( int ) (1e9 + 7), res = 1;
for ( int i = 1; i <= primeIndices; i++)
res = ( int ) ((1L * res * i) % mod);
for ( int i = 1; i <= (n - primeIndices); i++)
res = ( int ) ((1L * res * i) % mod);
return res;
}
public static void Main(String[] args)
{
int N = 5;
Console.Write(numPrimeArrangements(N));
}
}
|
Javascript
<script>
var MOD = parseInt(1e9 + 7);
function numPrimeArrangements(n)
{
var prime = Array.from({length: n+1}, (_, i) => true );
prime[0] = false ;
prime[1] = false ;
for ( var i = 2; i <= Math.sqrt(n); i++) {
if (prime[i])
for (factor = 2;
factor * i <= n;
factor++)
prime[factor * i] = false ;
}
var primeIndices = 0;
for ( var i = 1; i <= n; i++)
if (prime[i])
primeIndices++;
var mod = parseInt( (1e9 + 7)), res = 1;
for ( var i = 1; i <= primeIndices; i++)
res = ((1 * res * i) % mod);
for ( var i = 1; i <= (n - primeIndices); i++)
res = ((1 * res * i) % mod);
return res;
}
var N = 5;
document.write(numPrimeArrangements(N));
</script>
|
Time Complexity: O(N * log(log(N)))
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...