Note:
质数可以在质数的位置上瞎排,非质数可以在非质数的位置上瞎排,每个都是阶乘的排法
求出来1 ~ n所有的质数,分别算个阶乘,结果乘到一起就是答案
求质数就直接遍历就行了,开个表记录下来当前是不是质数,以及到当前位置质数有多少个
代码如下:
class Solution {
public:
int mod = 1e9 + 7;
int numPrimeArrangements(int n) {
vector<int> list;
int cnt[110];
for(int i = 2; i <= n; i ++){
bool isPrime = true;
for(int j = 2; j * j <= i; j ++){
if(i % j == 0) isPrime = false;
}
if(isPrime) list.push_back(i);
cnt[i] = list.size();
}
long long ans = 1, a = cnt[n], b = n - a;
for(int i = a; i > 1; i --) ans = ans * i % mod;
for(int i = b; i > 1; i --) ans = ans * i % mod;
return (int)ans;
}
};