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 }

你可能感兴趣的:(poj)