poj 2034 Anti-prime Sequences
题意:输入m, n, d。
求出m,m+1,m+2,````m+n的一个排列。使得任意的连续k个数之和都为合数,2<=k<=d。
注意如果开始时连续数小于d时也要是合数;
用DFS暴力搜索;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<cstring> using namespace std; int num[1024],S,E,d;; bool visit[1024],hash[10024]={0}; void Prime( ) { for( int i = 2 ; i <= 100 ; i ++ ) { if( hash[i] ) continue; for( int j = 2; j *i <=10000 ; j ++ ) hash[i*j] = 1; } } bool judge( int t ,int number) { if( t ==0 ) return true; int L = t - d + 1; if( L < 0 ) L =0; int sum = number; for( int i = t - 1; i >= L; i -- ) { sum += num[i]; if( !hash[sum] ) return false; } return true; } bool DFS( int n ) { if( n == E - S + 1 ) { return true; } for( int i = S ; i <= E; i ++ ) { if( !visit[i] && judge( n , i ) ) { visit[i] = true; num[n] = i; if(DFS( n + 1 )) return true; visit[i] = false; } } return false; } int main( ) { Prime( ); while( scanf( "%d %d %d",&S,&E,&d ),S||E||d ) { if( S + E + d == 0 ) break; memset( visit , 0 , sizeof(visit)); if( DFS( 0 ) == false) printf( "No anti-prime sequence exists.\n" ); else { printf( "%d",num[0] ); for( int i = 1; i <= E - S ; i ++ ) { printf( ",%d",num[i] ); } puts( "" ); } } //system( "pause" ); return 0; }