POJ 2034

题意:给定区间[n,m]和d求一个排列使得连续的小于等于d且大于1长度的序列之和为合数。

题解:dfs+剪枝即可

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int mr=10050;
 6 bool notp[mr];
 7 int pr[mr];
 8 int pn;
 9 void getpri()//筛素数
10 {
11     memset(notp,0,sizeof(notp));
12     pn=0;
13     for(int i=2; i<mr; i++)
14     {
15         if(!notp[i])
16         {
17             pr[pn++]=i;
18         }
19         for(int j=0; j<pn && i*pr[j]<mr; j++)
20         {
21             int k=i*pr[j];
22             notp[k]=1;
23             if(i%pr[j]==0)
24             {
25                 break;
26             }
27         }
28     }
29 }
30 int n,m,d;
31 int ans[1005],temp[1005];
32 bool vis[1005];
33 bool dfs(int k,int sum[])
34 {
35     if(k==m-n+1)
36     {
37         memcpy(ans,temp,sizeof(temp));
38         return true;
39     }
40     for(int i=n,j;i<=m;i++)
41     {
42         if(!vis[i])
43         {
44             int s[15];
45             s[1]=i;
46             for(j=2;j<=d;j++)
47             {
48                 if(sum[j-1]==0)
49                 {
50                     s[j]=0;
51                     continue;
52                 }
53                 s[j]=sum[j-1]+i;
54                 if(!notp[s[j]])
55                     break;
56             }
57             if(j<=d)
58                 continue;
59             vis[i]=true;
60             temp[k]=i;
61             if(dfs(k+1,s))
62                 return true;
63             vis[i]=false;
64         }
65     }
66     return false;
67 }
68 int main()
69 {
70     getpri();
71     notp[0]=true;
72     while(scanf("%d%d%d",&n,&m,&d),(n||m||d))
73     {
74         int sum[15];
75         memset(sum,0,sizeof(sum));
76         memset(vis,false,sizeof(vis));
77         if(dfs(0,sum))
78         {
79             int i,len=m-n;
80             for(i=0;i<len;i++)
81                 printf("%d,",ans[i]);
82             printf("%d\n",ans[len]);
83         }
84         else
85         {
86             printf("No anti-prime sequence exists.\n");
87         }
88     }
89     return 0;
90 }

转载于:https://www.cnblogs.com/tmeteorj/archive/2012/10/01/2709663.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值