题目是求从n到m字典序最小的且任意连续2,3,,d个数的和都是合数的序列。
用dfs即可。
#include<stdio.h>
#include<string.h>
#define maxn 10002
#define maxm 1002
int prime[maxn],a[maxn],vis[maxm];
int n,m,d;
void init()
{
prime[1]=1;
for(int i=2;i<=maxn;i++)
if(!prime[2])
{
for(int j=i+i;j<=maxn;j+=i)
prime[j]=1;
}
}
bool dfs(int depth)
{
if(depth==m-n+1)
{
return true;
}
for(int i=n;i<=m;i++)
if(!vis[i])
{
if(depth>=d-1)
{
int sum=i,ok=1;
for(int j=depth;j>=depth-d+2;j--)
{
sum+=a[j];
if(!prime[sum])
{ok=0;break;}
}
if(ok)
{
vis[i]=1;
a[depth+1]=i;
if(dfs(depth+1))
return true;
vis[i]=0;
}
}
else
{
int sum=i,ok=1;
for(int j=depth;j>=1;j--)
{
sum+=a[j];
if(!prime[sum])
{ok=0;break;}
}
if(ok)
{
vis[i]=1;
a[depth+1]=i;
if(dfs(depth+1))
return true;
vis[i]=0;
}
}
}
return false;
}
int main()
{
init();
while(~scanf("%d%d%d",&n,&m,&d)&&n)
{
memset(vis,0,sizeof(vis));
if(dfs(0))
{
for(int i=1;i<=m-n;i++)
printf("%d,",a[i]);
printf("%d\n",a[m-n+1]);
}
else
{
printf("No anti-prime sequence exists.\n");
}
}
return 0;
}