POJ 2034

这题主要是意思不太好理解,其实就是给定一个范围,然后指定一个区间d,使(2到d)的任意区间之和为合数即可。

不过开始的时候得用素数筛选法,把非素数给标记出来。

并输出这样的序列,直接搜索。。。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<vector>
 4 //#define end(x,y,z) (!((x == 0) && (y == 0) && (z == 0)))
 5 #define MAXN 10005
 6 using namespace std;
 7 int prime[MAXN];
 8 int fir,sec,d;
 9 bool vis[MAXN];
10 vector<int> SUM;
11 vector<int> data;
12 
13 bool dfs(int cnt, int sum)
14 {
15   if (cnt >= 2) {
16     for (int i(2); i<=min(cnt,d); ++i) {
17       int temp = SUM[SUM.size()-i-1];
18       if (!prime[sum - temp])return false;    
19     } 
20   }
21   if (cnt == sec - fir + 1)return true;
22   for (int i(fir); i<=sec; ++i) {
23     if (!vis[i]) {
24       vis[i] = true;
25       int temp = sum + i;
26       SUM.push_back(temp);
27       data.push_back(i);
28       if (dfs(cnt+1,temp)) {
29         return true;
30       } else {
31         data.pop_back();
32         SUM.pop_back();  
33       }
34       vis[i] = false;  
35     }  
36   }
37   return false;  
38 }
39 
40 int main()
41 {
42   for (int i(2); i<MAXN; ++i) {
43     if (!prime[i]) {
44       for (int j(i*i); j<MAXN; j += i)prime[j] = 1;
45     }   
46   }
47   while (scanf("%d%d%d",&fir,&sec,&d)) {
48     if (fir == 0 && sec == 0 && d == 0)break;
49     memset(vis,false,sizeof(vis));
50     SUM.clear();
51     data.clear();
52     SUM.push_back(0);
53     if (dfs(0,0)) {
54       cout<<data[0];
55       for (int i(1); i<data.size(); ++i) {
56         cout<<","<<data[i];  
57       }
58       cout<<endl;
59     } else {
60       cout<<"No anti-prime sequence exists."<<endl;  
61     }  
62   }
63   return 0;  
64 }
posted on 2012-05-24 00:10  Dev-T  阅读(587)  评论(0编辑  收藏  举报