1.质数排列
请你帮忙给从 1 到 n 的数设计排列方案,使得所有的「质数」都应该被放在「质数索引」(索引从 1 开始)上;你需要返回可能的方案总数。
让我们一起来回顾一下「质数」:质数一定是大于 1 的,并且不能用两个小于它的正整数的乘积来表示。
由于答案可能会很大,所以请你返回答案 模 mod 10^9 + 7 之后的结果即可。
1 <= n <= 100
链接:https://leetcode-cn.com/contest/weekly-contest-152/problems/prime-arrangements/
思路:这道题考察了筛素数,另外可以分析出题目让求是素数个数的排列和非素数个数的排列的乘积。
class Solution {
public:
int mod=1e9+7;
vector<bool> st;
vector<int> primers;
int numPrimeArrangements(int n) {
st=vector<bool>(n+1,false);
int num=get_primers(n);
long long int ans=1;
long long int c1=1;
long long int c2=1;
for(int i=1;i<=num;++i){
c1=1ll*c1*i%mod;
}
for(int i=1;i<=n-num;++i){
c2=1ll*c2*i%mod;
}
ans=1ll*c1*c2%mod;
return ans;
}
int get_primers(int n){
for(int i=2;i<=n;++i){
if(!st[i])primers.push_back(i);
for(int j=0;j<primers.size()&&primers[j]<=n/i;++j){
st[primers[j]*i]=true;
if(i%primers[j]==0)
break;
}
}
return primers.size();
}
};