POJ 2034 Anti-prime Sequences

题意:输入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 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值