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;
}