poj 2034 Anti-prime Sequences

来源:互联网 发布:虎视眈眈镜头数据 编辑:程序博客网 时间:2024/06/05 23:53

好像距离我上次在csdn上写博客已经很长时间了,总是给自己找各种借口让自己放弃,大二了,或许不久就要离开hust,还是决定要安静地学点自己喜欢的东西了。上星期本来是因为一点小破事心情不好去POJ上刷题,结果碰到了很多数论方面的题目,于是就把《数论概论》找来看了看,接着开始在POJ上做数论的题目。今天呢,我要贴出来的题目是关于素数的,是道水题,不过我还是花了一点点心思去理解。

题意:给出数列m,m+1,m+2,……,n,和d,重新找到一个数列,使得在这个数列中d个连续的数,d-1,d-2,……个连续的数字的和都是合数。

我的思路是:根据深搜的思想,一步一步确定新的数列中第1,2,3……n-m+1个数的值。如果第i+1个位置找不到值,则返回到第i步,如果找到则进入i+2步,如此循环下去,知道n-m+1个数字的值都找到。

下面上代码:

#include<stdio.h>#include<stdlib.h>#include<string.h>#define TRUE 1#define FALSE 0#define N 1010int p[N*10];    //若i为素数,则p[i[==1int used[N],sequence[N];  //used[i]==1表示i已经在sequence中int m,n,d;  //m,n,d含义分别如description所示void prime(void){    //利用筛法得出素数表    int i,j;    memset(p,1,sizeof(p));  //先假设所有数都是素数    p[0]=p[1]=0;    for(i=2;i*i<N*10;i++)    {        if(p[i])            for(j=2*i;j<N*10;j+=i) p[j]=0;    }}int judge(int index,int value){    //judge()用来判断sequence的index位置的函数置为value是否合适    int sum,i,indexleft;    //sum用于计算相邻的d个数的和,indexleft是最左边的数的下标    indexleft=index-d+1;    if(indexleft<0) indexleft=0;    sum=value;          //假设sequence[index]=value;    for(i=index-1;i>=indexleft;i--)    {        sum+=sequence[i];   //检验d个数相加是否能得到合数        if(p[sum])  return FALSE;  //如果相加过程中得到了素数,则返回FALSE,说明index位置不能放value    }    return TRUE;}int dfs(int index){    //用递归的方法写深搜    int i;    if(index==n-m+1) return TRUE;    //若搜索到下标为n-m+1,则说明sequence中的n-m+1个元素已经全部找到    for(i=m;i<=n;i++)    {        if(!used[i]&&judge(index,i))        {            sequence[index]=i;            used[i]=1;      //如果index位置可以放i,则将used[i]置为1,代表已用过            if(dfs(index+1))    return TRUE;            used[i]=0;      //如果深搜下一个位置的值,但是发现m~n都不行,则说明index位置不能放i            //故将used[i]重置为0        }    }    return FALSE;}int main(){    int i;    prime();    while(scanf("%d%d%d",&m,&n,&d)==3&&(m+n+d))    {        memset(used,0,sizeof(used));        if(dfs(0))        {            for(i=0;i<n-m;i++)    printf("%d,",sequence[i]);            printf("%d\n",sequence[n-m]);        }        else            printf("No anti-prime sequence exists.\n");    }    return 0;}


0 0