Overflow in intermediate arithmetic
Wrong move: Temporary multiplications exceed integer bounds.
Usually fails on: Large inputs wrap around unexpectedly.
Fix: Use wider types, modular arithmetic, or rearranged operations.
Build confidence with an intuition-first walkthrough focused on math fundamentals.
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.
Example 1:
Input: n = 5 Output: 12 Explanation: For example [1,2,5,4,3] is a valid permutation, but [5,2,3,4,1] is not because the prime number 5 is at index 1.
Example 2:
Input: n = 100 Output: 682289015
Constraints:
1 <= n <= 100Problem summary: 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.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Math
5
100
Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1175: Prime Arrangements
class Solution {
private static final int MOD = (int) 1e9 + 7;
public int numPrimeArrangements(int n) {
int cnt = count(n);
long ans = f(cnt) * f(n - cnt);
return (int) (ans % MOD);
}
private long f(int n) {
long ans = 1;
for (int i = 2; i <= n; ++i) {
ans = (ans * i) % MOD;
}
return ans;
}
private int count(int n) {
int cnt = 0;
boolean[] primes = new boolean[n + 1];
Arrays.fill(primes, true);
for (int i = 2; i <= n; ++i) {
if (primes[i]) {
++cnt;
for (int j = i + i; j <= n; j += i) {
primes[j] = false;
}
}
}
return cnt;
}
}
// Accepted solution for LeetCode #1175: Prime Arrangements
func numPrimeArrangements(n int) int {
count := func(n int) int {
cnt := 0
primes := make([]bool, n+1)
for i := range primes {
primes[i] = true
}
for i := 2; i <= n; i++ {
if primes[i] {
cnt++
for j := i + i; j <= n; j += i {
primes[j] = false
}
}
}
return cnt
}
mod := int(1e9) + 7
f := func(n int) int {
ans := 1
for i := 2; i <= n; i++ {
ans = (ans * i) % mod
}
return ans
}
cnt := count(n)
ans := f(cnt) * f(n-cnt)
return ans % mod
}
# Accepted solution for LeetCode #1175: Prime Arrangements
class Solution:
def numPrimeArrangements(self, n: int) -> int:
def count(n):
cnt = 0
primes = [True] * (n + 1)
for i in range(2, n + 1):
if primes[i]:
cnt += 1
for j in range(i + i, n + 1, i):
primes[j] = False
return cnt
cnt = count(n)
ans = factorial(cnt) * factorial(n - cnt)
return ans % (10**9 + 7)
// Accepted solution for LeetCode #1175: Prime Arrangements
struct Solution;
impl Solution {
fn number_of_primes(n: usize) -> i32 {
let mut a: Vec<bool> = vec![true; n + 1];
a[0] = false;
a[1] = false;
let mut i: usize = 2;
while i * i <= n {
if a[i] {
let mut j: usize = 2;
while i * j <= n {
a[i * j] = false;
j += 1;
}
}
i += 1;
}
let mut res = 0;
for k in 0..=n {
if a[k] {
res += 1;
}
}
res
}
fn num_prime_arrangements(n: i32) -> i32 {
let primes = Self::number_of_primes(n as usize);
let mut product = 1i64;
for i in 1..=primes {
product *= i as i64;
product %= 1_000_000_007;
}
for i in 1..=(n - primes) {
product *= i as i64;
product %= 1_000_000_007;
}
product as i32
}
}
#[test]
fn test() {
assert_eq!(Solution::num_prime_arrangements(5), 12);
assert_eq!(Solution::num_prime_arrangements(100), 682_289_015);
}
// Accepted solution for LeetCode #1175: Prime Arrangements
// Auto-generated TypeScript example from java.
function exampleSolution(): void {
}
// Reference (java):
// // Accepted solution for LeetCode #1175: Prime Arrangements
// class Solution {
// private static final int MOD = (int) 1e9 + 7;
//
// public int numPrimeArrangements(int n) {
// int cnt = count(n);
// long ans = f(cnt) * f(n - cnt);
// return (int) (ans % MOD);
// }
//
// private long f(int n) {
// long ans = 1;
// for (int i = 2; i <= n; ++i) {
// ans = (ans * i) % MOD;
// }
// return ans;
// }
//
// private int count(int n) {
// int cnt = 0;
// boolean[] primes = new boolean[n + 1];
// Arrays.fill(primes, true);
// for (int i = 2; i <= n; ++i) {
// if (primes[i]) {
// ++cnt;
// for (int j = i + i; j <= n; j += i) {
// primes[j] = false;
// }
// }
// }
// return cnt;
// }
// }
Use this to step through a reusable interview workflow for this problem.
Simulate the process step by step — multiply n times, check each number up to n, or iterate through all possibilities. Each step is O(1), but doing it n times gives O(n). No extra space needed since we just track running state.
Math problems often have a closed-form or O(log n) solution hidden behind an O(n) simulation. Modular arithmetic, fast exponentiation (repeated squaring), GCD (Euclidean algorithm), and number theory properties can dramatically reduce complexity.
Review these before coding to avoid predictable interview regressions.
Wrong move: Temporary multiplications exceed integer bounds.
Usually fails on: Large inputs wrap around unexpectedly.
Fix: Use wider types, modular arithmetic, or rearranged operations.