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 ; }