给定一个整数N ,任务是查找前N个正整数的排列数目,以使质数处于质数索引(基于1的索引)。
注意:由于方式的数量可能非常多,请以10 9 + 7为模返回答案。
例子:
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
方法:使用Eratosthenes筛
- 首先,使用Eratosthenes筛网计算1到N之间的所有素数。
- 接下来,遍历每个头寸并获得主要头寸的计数,将其称为k。
- 因此,对于k个质数,我们的选择有限,我们需要将它们排列在k个质数点中。
- 对于nk个非素数,我们的选择也有限。我们需要将它们安排在nk个非质数点中。
- 这两个事件都是独立的,因此总的方式将是它们的产物。
- 在k个盒子中排列k个对象的方式数为k!
下面是上述方法的实现:
C++
// C++ program to count
// permutations from 1 to N
// such that prime numbers
// occur at prime indices
#include
using namespace std;
static const int MOD = 1e9 + 7;
int numPrimeArrangements(int n)
{
vector prime(n + 1, true);
prime[0] = false;
prime[1] = false;
// Computing count of prime
// numbers using sieve
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;
// Computing permutations for primes
for (int i = 1; i <= primeIndices; i++)
res = (1LL * res * i) % mod;
// Computing permutations for non-primes
for (int i = 1; i <= (n - primeIndices); i++)
res = (1LL * res * i) % mod;
return res;
}
// Driver program
int main()
{
int N = 5;
cout << numPrimeArrangements(N);
return 0;
}
Java
// Java program to count
// permutations from 1 to N
// such that prime numbers
// occur at prime indices
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;
// Computing count of prime
// numbers using sieve
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;
// Computing permutations for primes
for (int i = 1; i <= primeIndices; i++)
res = (int) ((1L * res * i) % mod);
// Computing permutations for non-primes
for (int i = 1; i <= (n - primeIndices); i++)
res = (int) ((1L * res * i) % mod);
return res;
}
// Driver program
public static void main(String[] args)
{
int N = 5;
System.out.print(numPrimeArrangements(N));
}
}
// This code contributed by sapnasingh4991
Python3
# Python3 program to count
# permutations from 1 to N
# such that prime numbers
# occur at prime indices
import math;
def numPrimeArrangements(n):
prime = [True for i in range(n + 1)]
prime[0] = False
prime[1] = False
# Computing count of prime
# numbers using sieve
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
# Computing permutations for primes
for i in range(1, primeIndices + 1):
res = (res * i) % mod
# Computing permutations for non-primes
for i in range(1, n - primeIndices + 1):
res = (res * i) % mod
return res
# Driver code
if __name__=='__main__':
N = 5
print(numPrimeArrangements(N))
# This code is contributed by rutvik_56
C#
// C# program to count permutations
// from 1 to N such that prime numbers
// occurr at prime indices
using System;
class GFG{
//static int MOD = (int) (1e9 + 7);
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;
// Computing count of prime
// numbers using sieve
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;
// Computing permutations for primes
for(int i = 1; i <= primeIndices; i++)
res = (int) ((1L * res * i) % mod);
// Computing permutations for non-primes
for(int i = 1; i <= (n - primeIndices); i++)
res = (int) ((1L * res * i) % mod);
return res;
}
// Driver code
public static void Main(String[] args)
{
int N = 5;
Console.Write(numPrimeArrangements(N));
}
}
// This code is contributed by gauravrajput1
输出:
12
时间复杂度: O(N * log(log(N)))