📜  前N个正整数的置换,使得素数处于素数索引|套装2

📅  最后修改于: 2021-05-17 19:41:13             🧑  作者: Mango

给定一个整数N ,任务是查找前N个正整数的排列数目,以使质数处于质数索引(基于1的索引)。

注意:由于方式的数量可能非常多,请以10 9 + 7为模返回答案。

例子:

方法:使用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)))