输入S,T,D,输出从S到T的某种排列中长度不超过D的连续和都为合数,输出其中的一种排列,否则输出没有。。。。
#include<iostream>
#include<cstdio>
#include<cstring>
const int maxn=1000+10;
using namespace std;
bool pri[maxn*maxn],p[maxn];
int list[maxn];
int s,t,d;
void ss(){
for(int i=2;i<=1000;i++)
if(!pri[i])
for(int j=i*i;j<=600000;j+=i)pri[j]=true;
}
bool pd(int x,int u){
if(x<2)return true;
int sum=u;
for(int i=x-1;i>x-d&& i>=1;i--){
sum+=list[i];
if(!pri[sum])return false;
}
return true;
}
bool dfs(int x){
if(x>t-s+1){
for(int i=1;i<x-1;i++)printf("%d,",list[i]);
printf("%d\n",list[x-1]);
return true;
}
for(int i=s;i<=t;i++)
if(!p[i] && pd(x,i)){
list[x]=i;
p[i]=true;
if(dfs(x+1))return true;
p[i]=false;
}
return false;
}
int main(){
ss();
while(1){
cin>>s>>t>>d;
memset(p,0,sizeof(p));
if(s+t+d==0)return 0;
if(dfs(1)){
;
}else printf("No anti-prime sequence exists.\n");
}
return 0;
}

本文介绍了一个算法,该算法接收三个整数S、T、D作为输入,并尝试找到一种从S到T的排列方式,使得任意长度不超过D的连续子序列之和均为合数。若存在这样的排列,则输出;否则输出不存在。

341

被折叠的 条评论
为什么被折叠?



