题目描述
思路
找到质数并全排列
根据题意,要求符合要求的方案数,需要所有质数都放在质数索引上,所有合数放在合数索引上,质数放置和合数放置是相互独立的,所以总方案数为所有质数都放在质数索引上的方案数*所有合数都放在合数索引上的方案数。求所有质数都放在质数索引上的方案数,就是求指数个数的阶乘。求所有合数都放在合数索引上的方案数同理。求质数个数时,可以用试除法。
Python实现
class Solution:
def numPrimeArrangements(self, n: int) -> int:
numPrimes = sum(self.isPrime(i) for i in range(1, n+1))
return self.factirial(numPrimes) * self.factirial(n-numPrimes) % (10**9 + 7)
def isPrime(self, n):
if n == 1:
return 0
for i in range(2, int(sqrt(n))+1):
if n % i == 0:
return 0
return 1
def factirial(self, n):
ans = 1
for i in range(1, n+1):
ans *= i
ans %= (10**9 + 7)
return ans
Java实现
class Solution {
static final int MOD = 1000000007;
public int numPrimeArrangements(int n) {
int numPrimes = 0;
for (int i = 1; i <= n; i++) {
if (isPrime(i)) {
numPrimes++;
}
}
return (int) (fractorial(numPrimes) * fractorial(n-numPrimes) % MOD);
}
private boolean isPrime(int n) {
if (n == 1) {
return false;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
private long fractorial(int n) {
long ans = 1;
for (int i = 1; i <= n; i++) {
ans *= i;
ans %= MOD;
}
return ans;
}
}
C++实现
const int MOD = 1e9 + 7;
class Solution {
public:
int numPrimeArrangements(int n) {
int numPrimes = 0;
for (int i = 1; i <= n; i++) {
if (isPrime(i)) {
numPrimes++;
}
}
return (int) (factorial(numPrimes) * factorial(n - numPrimes) % MOD);
}
bool isPrime(int n) {
if (n == 1) {
return false;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
long factorial(int n) {
long res = 1;
for (int i = 1; i <= n; i++) {
res *= i;
res %= MOD;
}
return res;
}
};