poj 2034 Anti-prime Sequences
#include<iostream>
using namespace std;
bool isPrime[10002];
int prime[1000],total;
//线性筛法寻找素数
void makePrime()
{
total=0;
memset(isPrime,true,sizeof(isPrime));
for(int i=2;i<=maxn;i++)
{
if(isPrime[i])
prime[++total]=i;
for(int j=1;j<=total&& i*prime[j]<=maxn; j++)
{
isPrime[i*prime[j]]=false;
if(i%prime[j]==0)
break;
}
}
}
int arr[2000],tag[2000],res[2000];
int n,m,d,end;
void dfs(int id) //直接搜索
{
for(int i=n;i<=m;++i)
{
if(tag[i])
continue;
bool flag=1;
int j=id-1,s=i;
while(j>0&&id-j+1<=d)
{
s+=res[j];
if(isPrime[s])
{
flag=0;break;
}
j--;
}
if(flag)
{
res[id]=i;
tag[i]=1;
if(id==m-n+1)
{
end=1;
return;
}
dfs(id+1);
if(end==1)
return;
tag[i]=0;
}
}
}
int main()
{
makePrime();
while(scanf("%d%d%d",&n,&m,&d)&&n)
{
end=0;
memset(tag,0,sizeof(tag));
dfs(1);
if(end)
{
for(int i=1;i<m-n+1;++i)
printf("%d,",res[i]);
printf("%d\n",res[m-n+1]);
}
else
printf("No anti-prime sequence exists.\n");
}
return 0;
}