### 学习笔记
1.c++可以用long代替longlongint
2.c++^代表异或!,要算a的b次方:pow(a,b),要记得加头文件
3.1e9代表10的9次方!
题目:(力扣原题)
请你帮忙给从 1 到 n 的数设计排列方案,使得所有的「质数」都应该被放在「质数索引」(索引从 1 开始)上;(即质数应该排在第质数位上,如3排在第1位就是不行的,3是质数而1不是)
需要返回可能的方案总数。
让我们一起来回顾一下「质数」:质数一定是大于 1 的,并且不能用两个小于它的正整数的乘积来表示。
由于答案可能会很大,所以请你返回答案 模 mod 10^9 + 7 之后的结果即可。
### 代码
```cpp
const int MOD = 1e9 + 7;
class Solution {
public:
int numPrimeArrangements(int n) {
int primenum[101];//primenum[n]代表1到n的质数数量
allprime(primenum);
int i;
int ans=(int)((factorial(primenum[n])*factorial(n-primenum[n]))%MOD);
return ans;
}
long factorial(int n){
if(n==0) return 1;
else return ((n*(factorial(n-1))%MOD) % MOD);
}
void allprime(int primenum[]){
primenum[0]=0;
primenum[1]=0;
int i;
int prime[100];//用于从小到大保存质数
int j;
bool isP=1;
memset(prime,0,100);
//外层循环,i为当前循环需判断是否为质数的数,是则将该数加入prime数组并将primenum[i]赋值为primenum[i-1]+1,否则将primenum[i]赋值为primenum[i-1]
for(i=2;i<101;i++){
isP=1;
//内层循环,i依次判断能否被小于i的素数整除
for(j=0;prime[j]!=0;j++){
if(i%prime[j]==0) isP=0;
else;
}
if(isP){
primenum[i]=primenum[i-1]+1;
prime[j]=i;
}
else{
primenum[i]=primenum[i-1];
}
}
}
};
```