Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 20105 Accepted Submission(s): 9001
JGShining
题意:素数环 (经典搜索)
代码:
写法1:
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int yes[22]; bool in[22]; bool prim[50]; int n; void primtable() { int i,j; memset(prim,0,sizeof(prim)); for(i=3;i<=50;i++) { for(j=2;j<=i-1;j++) { if(i%j==0) prim[i]=true; } } } void dfs(int pos) { int i,u; if(pos>n) { int m=yes[1]+yes[n]; if(prim[m]==false) { for(i=1;i<=n;i++) printf("%d%c",yes[i],i==n?'\n':' '); //printf("\n"); //这里PE了一次 } return; } for(i=2;i<=n;i++) { u=i+yes[pos-1]; if(prim[u]==false&&in[i]==false) { yes[pos]=i; in[i]=true; dfs(pos+1); in[i]=false; } } } int main() { int cas=1; primtable(); while(scanf("%d",&n)!=EOF) { memset(in,0,sizeof(in)); yes[1]=1; in[1]=true; printf("Case %d:\n",cas++); dfs(2); printf("\n"); } return 0; } // 203MS
写法2:
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int yes[22]; bool in[22]; bool prim[50]; int n; void no_prim() { int tmp,i,j; for(i=3;i<20;i+=2) { if(prim[i]==false) { tmp=i<<1; for(j=i*i;j<50;j+=tmp) prim[j]=true; } } } void dfs(int pos) { int i,u; if(pos>n) { int m=yes[1]+yes[n]; if(prim[m]==false&&m%2||m==2) { for(i=1;i<=n;i++) printf("%d%c",yes[i],i==n?'\n':' '); //printf("\n"); } return; } for(i=2;i<=n;i++) { u=i+yes[pos-1]; if((!prim[u]&&u%2||u==2)&&in[i]==false) { yes[pos]=i; in[i]=true; dfs(pos+1); in[i]=false; } } } int main() { no_prim(); int cas=1; while(scanf("%d",&n)!=EOF) { memset(in,0,sizeof(in)); yes[1]=1; in[1]=true; printf("Case %d:\n",cas++); dfs(2); printf("\n"); } return 0; } // 234MS