您的位置:首页 > 产品设计 > UI/UE

POJ 2034 Anti-prime Sequences

2012-10-21 22:20 357 查看
素数筛选+dfs



#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
#define maxn 10005
int flag[maxn];
bool vis[1005];
int a[1005];
int n,m,d,cur,judge;

void prime()
{
    for(int i=2;i*i<maxn;i++)
    {
        if(!flag[i])
        {
            for(int j=i*i;j<maxn;j+=i)
            {
                flag[j]=1;
            }
        }
    }
}

int can()
{
    int sum=a[cur-1];
    int k=cur-d;
    if(k<0) k=0;
    for(int i=cur-2;i>=k;--i)
    {
        sum+=a[i];
        if(flag[sum]==0) return 0;
    }
    return 1;
}

bool dfs()
{
    if(cur>=2) 
    {
        if(!can()) return false;
    }
    if(cur==m-n+1) 
    {
        judge=1;
        return true;
    }
    for(int i=n;i<=m;++i)
    {
      if(!vis[i])
      {
            vis[i]=true;
            a[cur]=i;
            cur++;
            if(dfs()) return true;
            cur--;
            vis[i]=false;
      }  
    }
    return false;
}

int main()
{
    prime();
    while(cin>>n>>m>>d)
    {
        if(m+n+d==0) break;
      memset(vis,false,sizeof(vis));
      memset(a,0,sizeof(a));
      cur=0,judge=0;
      dfs();
      
      if(judge)
      {
            for(int i=0;i<m-n;++i)
            {
                cout<<a[i]<<',';
            }
            cout<<a[m-n]<<endl;
      }
      
      else
      cout<<"No anti-prime sequence exists."<<endl;
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: