题意:输入m, n, d。
求出m,m+1,m+2。。。m+n的一个排列。使得任意的连续k个数之和都为合数,2<=k<=d。
思路:素数打表,然后深搜。。
//196K 782MS
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define N 1005
#define MAX N*10
#define BUG puts("Hi") ;
bool prim[MAX] ;
bool flag[N] ;
int ans[N] ;
int m , n , d ;
void
Find_Prim ( ) //筛选素数
{
for ( int i = 1 ; i < MAX ; i ++ )
{
prim[i] = true ;
}
prim[1] = false ;
for ( int i = 2 ; i < MAX / 2 ; i ++ )
{
if ( prim[i] )
{
for ( int j = i + i ; j < MAX ; j += i )
{
prim[j] = false ;
}
}
}
}
bool Judge ( int const index , int const val ) //判断是否满足任意连续d个数为合数
{
if ( 0 == index )
{
return true ;
}
int left ;
left = index - d + 1 ;
if ( left < 0 )
{
left = 0 ;
}
int sum ;
sum = val ;
for ( int i = index - 1 ; i >= left ; i -- )
{
sum += ans[i] ;
if ( prim[sum] )
{
return false ;
}
}
return true ;
}
bool DFS ( int const index )
{
if ( index == m - n + 1 )
{
return true ;
}
for ( int i = n ; i <= m ; i ++ )
{
if ( !flag[i] ) //未标记
{
flag[i] = true ;
ans[index] = i ;
if ( Judge ( index , i ) && DFS ( index + 1 ) )
{
return true ;
}
flag[i] = false ; //回溯
}
}
return false ;
}
int
main ( )
{
Find_Prim ( ) ;
while ( EOF != scanf ("%d%d%d" , & n , & m , & d ) )
{
if ( 0 == n && 0 == m && 0 == d )
{
break ;
}
for ( int i = n ; i <= m ; i ++ )
{
flag[i] = false ;
}
if ( DFS ( 0 ) )
{
int i ;
for ( i = 0 ; i < m-n ; i ++ )
{
printf ("%d," , ans[i] ) ;
}
printf ("%d\n" , ans[i] ) ;
}
else
{
printf ("No anti-prime sequence exists.\n") ;
}
}
return 0 ;
}