素數環
時間限制:
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
1 /* 2 功能Function Description: NYOJ-488 3 開發環境Environment: DEV C++ 4.9.9.1 4 技術特點Technique: 5 版本Version: 6 作者Author: 可笑痴狂 7 日期Date: 20120815 8 備注Notes: 9 素數環:給定n,1~n組成一個素數環,相鄰兩個數的和為素數。 10 首先偶數(2例外,但是本題不會出現兩個數的和為2)不是素數, 11 所以素數環里奇偶間隔。如果n是奇數,必定有兩個奇數相鄰的情況。 12 所以當n為奇數時,輸出“No Answer”。 13 當n == 1時只1個數,算作自環,輸出1 14 所有n為偶數的情況都能變成奇偶間隔的環-----所以都有結果。 15 */ 16 #include<stdio.h> 17 #include<string.h> 18 19 int prime[40]={1,1,0,0,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1,01,1,1,0,1,1}; 20 int visit[21]; 21 int ring[21]; 22 23 /* 24 void Is_prime() 25 { 26 int i,j; 27 prime[0]=prime[1]=1; 28 for(i=2;i<=6;++i) 29 for(j=i*i;j<40;j+=i) 30 prime[j]=1; 31 } 32 */ 33 void DFS(int k,int n) 34 { 35 int i; 36 if(k==n+1&&prime[ring[n]+ring[1]]==0) 37 { 38 printf("1"); 39 for(i=2;i<=n;++i) 40 printf(" %d",ring[i]); 41 printf("\n"); 42 return; 43 } 44 for(i=2;i<=n;++i) 45 { 46 if(!visit[i]&&!prime[i+ring[k-1]]) 47 { 48 visit[i]=1; 49 ring[k]=i; 50 DFS(k+1,n); 51 visit[i]=0; 52 } 53 } 54 } 55 56 int main() 57 { 58 int T,n; 59 T=1; 60 // Is_prime(); 61 while(scanf("%d",&n),n) 62 { 63 printf("Case %d:\n",T++); 64 if(n==1) 65 { 66 printf("1\n"); 67 continue; 68 } 69 if(n&1) 70 { 71 printf("No Answer\n"); 72 continue; 73 } 74 memset(visit,0,sizeof(visit)); 75 visit[1]=ring[1]=1; 76 DFS(2,n); 77 } 78 return 0; 79 }