题目描述
中文题目就不给大家写故事背景了。给你1~n这n(0<n<19)个整数,让你把他们放在一个环上,使环上相邻的两个数的和为素数。对于一个整数n一共有多种方式构成这种素数环,把一共有多少方式输出,每种方式都有1开头。
例如:
n等于的时候,把1~6放在一个环
上面这个环就满足要求,1+4=5,5为素数。4+3=7,7为素数……6+1=7,7为素数。
输入样例:
6
输出样例:
2
解释:当n等于6的时候一共有
1 4 3 2 5 6
1 6 5 2 3 4
上面这2种方式
输入样例:
8
输出样例:
4
解释:当n等于8的时候一共有
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
上面这
4
种方式构成素数环。
可以使用递归实现
#include <stdio.h>
#include <math.h>
#include <string.h>
int len;
int ans;
int prime[12] = {2,3,5,7,11,13,17,19,23,29,31,37};
int isprime[40];
void primering(int ring[], int f[], int n)
{
if (n == len)
{
if (isprime[ring[n]+1] == 1)
ans++;
return;
}
int i;
for (i = 2; i <= len; ++i)
{
if (isprime[ring[n]+i] == 1 && f[i] == 0)
{
f[i] = 1;
ring[n+1] = i;
primering(ring, f, n+1);
f[i] = 0;
}
}
return;
}
int main()
{
ans = 0;
scanf("%d", &len);
int i, j;
int f[30] = {0};
int ring[30];
if (len == 1 || len == 2)
ans = 1;
else if (len % 2 == 1)
ans = 0;
else
{
memset(isprime, 0, sizeof(isprime));
for (j = 0; j < 12; ++j)
isprime[prime[j]] = 1;
ring[1] = 1;
for (i = 2; i <= len; ++i)
{
if (isprime[i+1] == 1 && f[i] == 0)
{
f[i] = 1;
ring[2] = i;
primering(ring, f, 2);
f[i] = 0;
}
}
}
printf("%d\n", ans);
return 0;
}