A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.

Note: the number of first circle should always be 1.

Input

n (0 < n < 20).

Output

The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order.

You are to write a program that completes above process.

Print a blank line after each case.

Sample Input

6
8

Sample Output

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

题意:

       使1~n的数以1为开头形成一个素数环,即相邻两个数之和为素数。

思路:

      深搜,判断末尾数与第一个数之和是否为素数,判断相邻两数之和是否为素数即可。

     PE了一次,发现是输出后多了一个空格,不说了都是泪。

代码:

#include<stdio.h>
#include<math.h>
int n,k,m,j,t=1;
int a[30],book[30];
int prime(int x)
{
    int k,i;
    k=sqrt(x);
    for(i=2;i<=k;i++)
    {
        if(x%i==0)
            break;
    }
    if(i>k)
        return 1;
    return 0;
}
void dfs(int m)
{
    int i;
    if(m==n&&prime(a[0]+a[m-1])==1)
    {
        for(i=0;i<m-1;i++)
            printf("%d ",a[i]);
        printf("%d\n",a[m-1]);
        return;
    }
    for(i=2;i<=n;i++)
    {
        if(book[i]==0)
        {
            if(prime(i+a[m-1])==1)
            {
                book[i]=1;
                a[m++]=i;
                dfs(m);
                book[i]=0;
                m--;
            }    
        }
        
    }
    return;
}
int main()
{
    int i,t=1;
    while(scanf("%d",&n)!=EOF)
    {
        a[0]=1;
        printf("Case %d:\n",t);
        dfs(1);
        t++;
        printf("\n");
    }
    return 0;
}