素数判断+DFS POJ2034
来源:互联网 发布:华为因数据丢失事件 编辑:程序博客网 时间:2024/05/21 16:54
题意:
构造一个n到m的数的序列,使得任意连续的2个数,3个数,4个数...d个数的和都为合数。
先打素数表,然后DFS搜索,对于每个数都判断它和前面的数的和是否满足条件。
代码:
#include <cstdlib>#include <cctype>#include <cstring>#include <cstdio>#include <cmath>#include<climits>#include <algorithm>#include <vector>#include <string>#include <iostream>#include <sstream>#include <map>#include <set>#include <queue>#include <stack>#include <fstream>#include <numeric>#include <iomanip>#include <bitset>#include <list>#include <stdexcept>#include <functional>#include <utility>#include <ctime>using namespace std;#define PB push_back#define MP make_pair#define REP(i,x,n) for(int i=x;i<(n);++i)#define FOR(i,l,h) for(int i=(l);i<=(h);++i)#define FORD(i,h,l) for(int i=(h);i>=(l);--i)#define SZ(X) ((int)(X).size())#define ALL(X) (X).begin(), (X).end()#define RI(X) scanf("%d", &(X))#define RII(X, Y) scanf("%d%d", &(X), &(Y))#define RIII(X, Y, Z) scanf("%d%d%d", &(X), &(Y), &(Z))#define DRI(X) int (X); scanf("%d", &X)#define DRII(X, Y) int X, Y; scanf("%d%d", &X, &Y)#define DRIII(X, Y, Z) int X, Y, Z; scanf("%d%d%d", &X, &Y, &Z)#define OI(X) printf("%d",X);#define RS(X) scanf("%s", (X))#define MS0(X) memset((X), 0, sizeof((X)))#define MS1(X) memset((X), -1, sizeof((X)))#define LEN(X) strlen(X)#define F first#define S second#define Swap(a, b) (a ^= b, b ^= a, a ^= b)#define Dpoint strcut node{int x,y}#define cmpd int cmp(const int &a,const int &b){return a>b;} /*#ifdef HOME freopen("in.txt","r",stdin); #endif*/const int MOD = 1e9+7;typedef vector<int> VI;typedef vector<string> VS;typedef vector<double> VD;typedef long long LL;typedef pair<int,int> PII;//#define HOMEint Scan(){int res = 0, ch, flag = 0;if((ch = getchar()) == '-')//判断正负flag = 1;else if(ch >= '0' && ch <= '9')//得到完整的数res = ch - '0';while((ch = getchar()) >= '0' && ch <= '9' )res = res * 10 + ch - '0';return flag ? -res : res;}/*----------------PLEASE-----DO-----NOT-----HACK-----ME--------------------*/int n,m,d;int vis[10000];int prime[10000];void getprime(){ int cnt=0; for(int i=2;i<=10000;i++) if(!vis[i]) { for(int j=i*i;j<=10000;j+=i) vis[j]=1; }}int vis2[1005];int ans[1005];int ok;void dfs(int cur,int sum){if(ok)return;if(cur==m-n+2){ok=1;return;}for(int i=n;i<=m;i++)if(!vis2[i]){ if(cur<d) {int ok2=1; int tmp=i; for(int j=cur-1;j>=1;j--) {if(!vis[ans[j]+tmp]) { ok2=0; break; } tmp+=ans[j]; } if(ok2) {vis2[i]=1; ans[cur]=i; dfs(cur+1,sum+i); vis2[i]=0;} } else {int ok2=1; int tmp=i; for(int j=cur-1;j>=cur+1-d;j--) {if(!vis[tmp+ans[j]]) { ok2=0; break; } tmp+=ans[j];} if(ok2) { vis2[i]=1; ans[cur]=i; dfs(cur+1,sum-ans[cur-d+1]+i); vis2[i]=0; } } if(ok) return;}}int main(){getprime();while(RIII(n,m,d)!=EOF){ if(!n&&!m&&!d) break; MS0(vis2); ok=0; dfs(1,0); if(!ok) {printf("No anti-prime sequence exists.\n"); continue;} REP(i,1,m-n+1) printf("%d,",ans[i]); printf("%d\n",ans[m-n+1]);} return 0;}
0 0
- 素数判断+DFS POJ2034
- poj2034 dfs
- POJ2034 Anti-prime Sequences【素数筛法】【DFS】
- hdu1016 DFS+素数判断
- poj2034
- POJ2034
- HDU 1016 Prime Ring Problem(DFS回溯+素数判断)
- 夕拾算法进阶篇:8)组合+判断素数(dfs)
- 素数判断
- 判断素数
- 判断素数
- 判断素数
- 素数判断
- 判断素数
- 判断素数
- 判断素数
- 判断素数
- 判断素数
- 软件功能测试Checklist 在 Web 测试中的重要性
- leetcode_Multiply Strings
- UML类图与类的关系详解
- perl the special operator
- qemu for windows编译
- 素数判断+DFS POJ2034
- 在Linux下安装JITwatch
- Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
- 黑马程序员——java的IO之File类
- java 异常java.lang.UnsupportedOperationException
- 15. 3Sum
- Solr之介绍与安装
- "set -e" 与 "set -o pipefail"
- Python输出中文乱码问题