SOJ - 1002 POJ - 2034 Anti-prime Sequences

4 篇文章 0 订阅
3 篇文章 0 订阅

     链接:SOJ - 1002   POJ -- 2034

     题意:给 3 个整数 n, m ,d,求一个最小字母序的序列,包含 n 到 m  之间的所有数字,并且任意连续 2 个数、3个数... 到d 个数的和都不是素数。

     解法:先把素数筛出来,然后暴力 dfs.


#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

int num[1001],d,n,m;
bool ever[1001],isprime[10010],flag;

//检查加入 x 后是否还符合条件
bool check(int len, int x)
{
    int sum = x;
    for(int i = len - 1;i >= 0 && i > len - d ;--i)
    {
        sum += num[i];
        if(isprime[sum]) return false;
    }
    return true;
}

//len 代表已选中的数的个数
void dfs(int len)
{
    if(len == m - n + 1 || flag )
    {
        flag  = true;
        return ;
    }
    for(int i = n;i <= m;++i)
    {
        if(!ever[i] && check(len, i) && !flag)
        {
            num[len] = i;
            ever[i] = 1;
            dfs(len + 1);
            ever[i] = 0;
        }
    }
}

int main()
{
    memset(isprime,1,sizeof(isprime));
    for(int i = 2;i < 101;++i)
    {
        if(isprime[i])
        {
            for(int j = i*i;j < 10001;j += i)
                isprime[j] = false;
        }
    }
    isprime[1] = 0;
    while(scanf("%d%d%d",&n,&m,&d),n + m)
    {
        memset(ever,0,sizeof(ever));
        flag = false;
        dfs(0);
        if(flag)
        {
            printf("%d",num[0]);
            for(int i = 1;i <= m - n;++i)
                printf(",%d",num[i]);
            printf("\n");
        }
        else
            printf("No anti-prime sequence exists.\n");
    }
    return 0;
}  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值