Return the number of permutations of 1 to n so that prime numbers are at prime indices (1-indexed.)
(Recall that an integer is prime if and only if it is greater than 1, and cannot be written as a product of two positive integers both smaller than it.)
Since the answer may be large, return the answer modulo 10^9 + 7.
The key idea is that the only way to satisfy the condition is to place all primes at prime indices and all non-primes at non-prime indices. The number of ways to arrange the primes among the prime indices is the factorial of the number of primes, and similarly for non-primes.
classSolution {
public:int numPrimeArrangements(int n) {
int mod =1e9+7;
vector<bool> isPrime(n+1, true);
isPrime[0] = isPrime[1] = false;
for (int i =2; i * i <= n; ++i) {
if (isPrime[i]) {
for (int j = i * i; j <= n; j += i) isPrime[j] = false;
}
}
int p =0;
for (int i =2; i <= n; ++i) if (isPrime[i]) ++p;
longlong ans =1;
for (int i =2; i <= p; ++i) ans = (ans * i) % mod;
for (int i =2; i <= n - p; ++i) ans = (ans * i) % mod;
return ans;
}
};
classSolution {
publicintnumPrimeArrangements(int n) {
int mod = 1000000007;
boolean[] isPrime =newboolean[n+1];
Arrays.fill(isPrime, true);
isPrime[0]= isPrime[1]=false;
for (int i = 2; i * i <= n; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= n; j += i) isPrime[j]=false;
}
}
int p = 0;
for (int i = 2; i <= n; i++) if (isPrime[i]) p++;
long ans = 1;
for (int i = 2; i <= p; i++) ans = ans * i % mod;
for (int i = 2; i <= n - p; i++) ans = ans * i % mod;
return (int)ans;
}
}
classSolution {
funnumPrimeArrangements(n: Int): Int {
val mod = 1_000_000_007
val isPrime = BooleanArray(n+1) { true }
isPrime[0] = false; isPrime[1] = falsefor (i in2..n) {
if (isPrime[i]) {
var j = i * i
while (j <= n) {
isPrime[j] = false j += i
}
}
}
var p = 0for (i in2..n) if (isPrime[i]) p++var ans = 1Lfor (i in2..p) ans = ans * i % mod
for (i in2..(n-p)) ans = ans * i % mod
return ans.toInt()
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
classSolution:
defnumPrimeArrangements(self, n: int) -> int:
mod =10**9+7 is_prime = [True] * (n+1)
is_prime[0] = is_prime[1] =Falsefor i in range(2, int(n**0.5)+1):
if is_prime[i]:
for j in range(i*i, n+1, i):
is_prime[j] =False p = sum(is_prime)
ans =1for i in range(2, p+1):
ans = ans * i % mod
for i in range(2, n-p+1):
ans = ans * i % mod
return ans
impl Solution {
pubfnnum_prime_arrangements(n: i32) -> i32 {
let n = n asusize;
letmut is_prime =vec![true; n+1];
is_prime[0] =false;
is_prime[1] =false;
for i in2..=((n asf64).sqrt() asusize) {
if is_prime[i] {
letmut j = i * i;
while j <= n {
is_prime[j] =false;
j += i;
}
}
}
let p = is_prime.iter().filter(|&&x| x).count();
letmut ans: i64=1;
let m =1_000_000_007;
for i in2..=p { ans = ans * i asi64% m; }
for i in2..=(n-p) { ans = ans * i asi64% m; }
ans asi32 }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
classSolution {
numPrimeArrangements(n: number):number {
constmod=1e9+7;
constisPrime= Array(n+1).fill(true);
isPrime[0] =isPrime[1] =false;
for (leti=2; i*i<=n; i++) {
if (isPrime[i]) {
for (letj=i*i; j<=n; j+=i) isPrime[j] =false;
}
}
letp=0;
for (leti=2; i<=n; i++) if (isPrime[i]) p++;
letans=1;
for (leti=2; i<=p; i++) ans=ans*i%mod;
for (leti=2; i<=n-p; i++) ans=ans*i%mod;
returnans;
}
}