poj Anti-prime Sequences
Anti-prime Sequences
Time Limit: 3000MS | Memory Limit: 30000K | |
Total Submissions: 2175 | Accepted: 1022 |
Description
Given a sequence of consecutive integers n,n+1,n+2,...,m, an anti-prime sequence is a rearrangement of these integers so that each adjacent pair of integers sums to a composite (non-prime) number. For example, if n = 1 and m = 10, one such anti-prime sequence is 1,3,5,4,2,6,9,7,8,10. This is also the lexicographically first such sequence.
We can extend the definition by defining a degree danti-prime sequence as one where all consecutive subsequences of length 2,3,...,d sum to a composite number. The sequence above is a degree 2 anti-prime sequence, but not a degree 3, since the subsequence 5, 4, 2 sums to 11. The lexicographically .rst degree 3 anti-prime sequence for these numbers is 1,3,5,4,6,2,10,8,7,9.
We can extend the definition by defining a degree danti-prime sequence as one where all consecutive subsequences of length 2,3,...,d sum to a composite number. The sequence above is a degree 2 anti-prime sequence, but not a degree 3, since the subsequence 5, 4, 2 sums to 11. The lexicographically .rst degree 3 anti-prime sequence for these numbers is 1,3,5,4,6,2,10,8,7,9.
Input
Input will consist of multiple input sets. Each set will consist of three integers, n, m, and d on a single line. The values of n, m and d will satisfy 1 <= n < m <= 1000, and 2 <= d <= 10. The line 0 0 0 will indicate end of input and should not be processed.
Output
For each input set, output a single line consisting of a comma-separated list of integers forming a degree danti-prime sequence (do not insert any spaces and do not split the output over multiple lines). In the case where more than one anti-prime sequence exists, print the lexicographically first one (i.e., output the one with the lowest first value; in case of a tie, the lowest second value, etc.). In the case where no anti-prime sequence exists, output
No anti-prime sequence exists.
No anti-prime sequence exists.
Sample Input
1 10 2 1 10 3 1 10 5 40 60 7 0 0 0
Sample Output
1,3,5,4,2,6,9,7,8,10 1,3,5,4,6,2,10,8,7,9 No anti-prime sequence exists. 40,41,43,42,44,46,45,47,48,50,55,53,52,60,56,49,51,59,58,57,54
题意:求n到m的数中任意连续2到d的数的和是合数
DFS
#include<stdio.h> #include<string.h> #include<math.h> const int MAXN=10001; int n,m,d; int vis[MAXN]; int num[MAXN]; int pri[MAXN]; int ans; int flag; void init () { memset(pri,0,sizeof(pri)); pri[0] = pri[1] = 1; for ( int i = 2; i <= 100; i++ ) { if ( pri[i] ) continue; for ( int j = 2; i * j < 10001; j++ )//这里错了 pri[i*j] = 1; } } bool judge(int t,int step) { num[step]=t; if(step>0) { ans=0; int judge=0; for(int j=step; j>=step-d+1; j--) { ans+=num[j]; if(judge==1 && pri[ans]==0) { return false; } judge=1; if(j==0) break; } } return true; } void DFS(int step) { int ans,i,t; if(flag) return ; if(step==m-n+1)//已经找到了 { flag=1 ; return ; } for(i=n; i<=m; i++) { t=0; if(flag) return ; if(!vis[i] && judge(i,step)) { vis[i]=1; DFS(step+1); vis[i]=0; } } } int main() { int i,j; init(); while(scanf("%d%d%d",&n,&m,&d)) { flag=0; if(n==0 && m==0 && d==0) break; memset(vis,0,sizeof(vis)); DFS(0); if(!flag) printf("No anti-prime sequence exists."); else { for(i=0; i<=m-n; i++) if(i==0) printf("%d",num[i]); else printf(",%d",num[i]); } printf("\n"); } return 0; }