Description
把前n个正整数摆成1个环,如果环中所有相邻的2个数之和都是1个素数,该环称为1个n项素数和环。 输入1个整数n,输出共有多少种
Input
输入一个正整数n
Output
输出环的个数,要求环的第一个数字是1
Sample Input
4
Sample Output
2
HINT
大意:回溯,要会写dfs得到全排列
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 66666;
int vis[maxn];
int a[maxn];
void dfs(int step)
{
if(step == n + 1){
for(int i = 1; i <= n; i++)
printf("%d",a[i]);
return ;
}
else {
for(int i = 1; i <= n ; i++){
if(!vis[i]){
vis[i] = 1;
a[step] = i;
dfs(step+1);
vis[i] = 0;
}
}
}
}
AC代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 666666;
int vis[maxn];
int n,cout;
int a[maxn];
int prim(int n){
int i;
for( i = 2; i*i <= n ;i++){
if(n%i == 0)
break;
}
if(i*i > n)
return 1;
return 0;
}
void dfs(int step)
{
if(step == n+1){
int i;
//for(int j = 1; j <= n ;j++)
// printf("%d",a[j]);
// puts("");
for( i = 1; i <= n ;i++){
int x = a[i],y = a[i+1];
if(i == n){
y = a[1];
}
if(prim(x+y) == 0){
break;
}
}
if(i > n) {
//for(int i = 1; i <= n ;i++)
// printf("%d",a[i]);
// puts("");
// printf("%d %d\n",a[4]+a[5],prim(a[4]+a[5]));
cout++;
}
}
for(int i = 2; i <= n ; i++){
if(!vis[i]){
vis[i] = 1;
a[step] = i;
dfs(step+1);
vis[i] = 0;
}
}
}
int main()
{
a[1] = 1;
while(~scanf("%d",&n)){
if(n%2 == 1)
printf("0\n");
else {
cout = 0;
dfs(2);
printf("%d\n",cout);
}
}
return 0;
}