冯如杯完了,有时间可以惬意的刷几道了。
这题是求n到m的一个排列,满足相邻的2个,3个……d个数的和都不为素数(都要满足)。
然后上代码,挺简单,是所以发代码,是觉得自己写得比较漂亮。(呵呵,不要喷我)
#include <iostream>
using namespace std;
bool ans,p[10010],h[1010];
int n,m,d,a[1010],sum[11];
void dfs(int dep) {
if (ans) return;
if (dep==m-n+2) {
ans = true;
for (int i=1;i<dep-1;i++)
printf("%d,",a[i]);
printf("%d\n",a[dep-1]);
return;
}
for (int i=n;i<=m;i++)
if (!h[i]) {
bool conti = 0;
for (int k=2;k<=d;k++) {
if (dep==k && p[sum[k]+i]) conti = 1;
if (dep>k && p[sum[k]+i-a[dep-k]]) conti = 1;
}
if (conti==1) continue;
h[i] = 1;
a[dep] = i;
for (int k=2;k<=d;k++) {
sum[k] += i;
if (dep>k) sum[k] -= a[dep-k];
}
dfs(dep+1);
for (int k=2;k<=d;k++) {
sum[k] -= i;
if (dep>k) sum[k] += a[dep-k];
}
h[i] = 0;
}
}
int main() {
memset(p,1,sizeof(p));
p[1] = 0;
for (int i=2;i<=10000;i++)
if (p[i]) for (int j=i+i;j<=10000;j+=i) p[j] = false;
while (~scanf("%d%d%d",&n,&m,&d)) {
if (n==0 && m==0 && d==0) break;
memset(h,0,sizeof(h));
memset(sum,0,sizeof(sum));
ans = 0;
dfs(1);
if (!ans) printf("No anti-prime sequence exists.\n");
}
return 0;
}