<p>Return the number of permutations of 1 to <code>n</code> so that prime numbers are at prime indices (1-indexed.)</p>

<p><em>(Recall that an integer&nbsp;is prime if and only if it is greater than 1, and cannot be written as a product of two positive integers&nbsp;both smaller than it.)</em></p>

<p>Since the answer may be large, return the answer <strong>modulo <code>10^9 + 7</code></strong>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> n = 5
<strong>Output:</strong> 12
<strong>Explanation:</strong> 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.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> n = 100
<strong>Output:</strong> 682289015
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= n &lt;= 100</code></li>
</ul>

import math

class Solution:
    def numPrimeArrangements(self, n: int) -> int:
       # count primes
        def countPrimes(n):
            if n < 2:
                return 0
            prime_count = 0
            seen = [False, True] + [False] * (n - 1)
            prime = 2
            while prime < len(seen):
                while seen[prime]:
                    prime += 1
                    if prime > n:
                        return n - sum(seen)
                num = prime
                while num <= n - prime:
                    num += prime
                    seen[num] = True
                prime += 1
            return n - sum(seen)

        num_primes = countPrimes(n)
        return math.factorial(num_primes) * math.factorial(n - num_primes) % (10**9 + 7)
                



24