poj2034 Anti-prime Sequences

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 10000//调试时用100,提交时改成5000
int p[10000];
bool isprime[10000];
void init()
{
    //memset(p,0,sizeof(p));
    memset(isprime,true,sizeof(isprime));
    int i,j;
    int np=0;
    for(i=2;i<MAX;i++)
    {
        if(isprime[i])
        {
            p[np++]=i;
        }
        for(j=0;j<MAX&&i*p[j]<MAX;j++)
        {
            isprime[i*p[j]]=false;
            if(i%p[j]==0)
            {
                break;
            }
        }
    }
}
int m,n,d;
bool flag;
int res[1010];
bool used[1010];
void cc();
void dfs(int k)//
{
    if(flag)
    {
        return;
    }
    int sum;
    int i,j;
    for(i=m;i<=n;i++)
    {
        bool sign=false;
        sum=i;
        if(used[i])
        {
            continue;
        }
        int temp=k-d+1;
        temp=temp<0?0:temp;
        if(k!=0)
        {
            for(j=k-1;j>=temp;j--)
            {
                sum+=res[j];
                if(isprime[sum])
                {
                    sign=true;
                    break;
                }
            }
        }
        if(sign)
        {
            continue;
        }
        used[i]=true;
        res[k]=i;
        if(k==n-m)
        {
            cc();
            return;
        }
        dfs(k+1);
        used[i]=false;
    }
}
void cc()
{
    int i;
    printf("%d",res[0]);
    for(i=1;i<=n-m;i++)
    {
        printf(",%d",res[i]);
    }
    printf("\n");
    flag=true;
}
int main()
{
    init();//完成素数筛选
    while(scanf("%d %d %d",&m,&n,&d),m||n||d)
    {
        flag=false;
        memset(used,false,sizeof(used));
        int k=0;
        dfs(k);
        if(flag==false)
        {
            printf("No anti-prime sequence exists.\n");
        }
    }
    //system("PAUSE");
    return 0;
}

posted @ 2012-07-12 08:49  willzhang  阅读(214)  评论(0编辑  收藏  举报