素数筛和全排列

链接: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;
}
posted @ 2023-11-10 20:54  lipu123  阅读(76)  评论(0)    收藏  举报