素数筛和全排列
链接:https://ac.nowcoder.com/acm/contest/68346/B
来源:牛客网
游游想知道,有多少个长度为\(n\)的排列满足任意两个相邻元素之和都不是素数。你能帮帮她吗?
我们定义,长度为\(n\)的排列值一个长度为\(n\)的数组,其中1到\(n\)每个元素恰好出现了一次。
输入描述:
一个正整数\(n\)。
\(2≤n≤10\)
输出描述:
满足条件的排列数量。
示例1
输入
5
输出
4
说明
共有以下 4 种合法排列:
[1,3,5,4,2]
[3,1,5,4,2]
[2,4,5,1,3]
[2,4,5,3,1]
这个主要涉及到全排列和素数筛
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e4+100;
int ans=0,n;
int vis[maxn];
int res[maxn];
int prime[maxn],biaoji[maxn],cnt=0;
void inint(){
for(int i=2;i<maxn;i++){
if(!biaoji[i]) prime[++cnt]=i;
for(int j=1;j<=cnt&&i*prime[j]<maxn;j++){
biaoji[i*prime[j]]=1;
if(i%prime[j]==0){
break;
}
}
}
}
void dfs(int t){
if(t>n){
int bo=1;
for(int i=2;i<=n;i++){
if(!biaoji[res[i]+res[i-1]]){
bo=0;
break;
}
}
if(bo){
ans++;
}
return ;
}
for(int i=1;i<=n;i++){
if(vis[i]==0){
vis[i]=1;
res[t]=i;
dfs(t+1);
vis[i]=0;
}
}
}
int main(){
inint();
//prime[2]=1,prime[3]=1,prime[5]=1,prime[7]=1;
cin>>n;
dfs(1);
cout<<ans<<endl;
}