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 }