题目描述
请你帮忙给从1到n的数设计排列方案,使所有的质数都被放在质数索引(索引值从1开始)上;你需要返回可能的方案总数。让我们一起来回顾一下质数:质数一定是大于1的,并且不能用两个小于它的正整数的乘积来表示。由于答案可能会很大,所以请你返回答案模mod 109+7 之后的结果即可。
示例
输入:n=5输出:12解释:举个例子,[1,2,5,4,3]是一个有效的排列,但[5,2,3,4,1]不是,因为在第2种情况下质数5被错误地放在索引值为1的位置上了。
思路
这个题是先寻找范围n内的质数,然后使用n减去质数,得到非质数,分别求取两个数列的阶乘,相加之后就可以得到结果
class Solution(object):
def numPrimeArrangements(self, n):
"""
:type n: int
:rtype: int
"""
def fac(n):
if(n<=1):
return 1
return n*fac(n-1)
primes=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101]
primeCount=0
while(primes[primeCount]<=n):
primeCount+=1
return fac(primeCount)*fac(n-primeCount)%(10**9+7)