素数环


时间限制: 1000 ms  |           内存限制: 65535 KB

难度:2



有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。

为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。



有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束。 输出 每组第一行输出对应的Case序号,从1开始。

如果存在满足题意叙述的素数环,从小到大输出。


否则输出No Answer。

样例输入

6
8
3
0


样例输出

Case 1:
1 4 3 2 5 6
1 6 5 2 3 4
Case 2:
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
Case 3:
No Answer


#include<stdio.h>
#include<string.h>
#include<math.h>
int b[21],a[21];
int n;
int f(int x)
{
	int i;
	for(i=2;i<=sqrt(x);i++)
	{
		if(x%i==0)
			return 0;
	}
	return 1;
}
void dfs(int x)
{
	int i,j;
	if(x==n+1&&f(1+a[n]))
	{
		for(i=1;i<=n;i++)
		{
			if(i>1)
				printf(" ");
				printf("%d",a[i]);
		}
		printf("\n");
		return ;
	}
	else
	{
		for(i=2;i<=n;i++)
		{
			if(b[i]==0&&f(i+a[x-1]))
			{
				b[i]=1;
				a[x]=i;
				dfs(x+1);
				b[i]=0;
			}
		}
		return ;
	}
}
int main()
{
	int c=1;
	int i;
	while(scanf("%d",&n),n)
	{
		for(i=1;i<=n;i++)
		{
			a[i]=0;
			b[i]=0;
		}
		a[1]=b[1]=1;
		printf("Case %d:\n",c++);
		if(n&1)
		{
			if(n==1)
				printf("1\n");
			else
				printf("No Answer\n");
		}
		else
			dfs(2);
	}
	return 0;
}