poj2739(尺取法)

Sum of Consecutive Prime Numbers

题意:

  给出一个数n,它可以表示为连续的素数相加之和,问一共有多少种表示方法?

分析:

  枚举每个素数为左端点,根据区间和确定其右端点,如果区间和大于n,左端点右移,如果等于n,则方法数+1。

代码:

#include <map>
#include <math.h>
#include <string>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>

using namespace std;
#define ll long long
#define ull unsigned long long
#define cls(x) memset(x,0,sizeof(x))
#define clslow(x) memset(x,-1,sizeof(x))

const int maxn=1e4+100;

int n,cnt;

bool vis[maxn];
int prime[maxn],sum[maxn];

void init()
{
    cnt=0;
    cls(vis);
    vis[1]=true;
    for(int i=2;i<maxn;i++){
        for(int j=i*i;j<maxn&&!vis[i];j+=i){
            vis[j]=true;
        }
    }
    for(int i=1;i<maxn;i++){
        if(!vis[i])    prime[++cnt]=i;
    }

    sum[0]=0;
    for(int i=1;i<=cnt;i++){
        if(i==1)    sum[i]=prime[i];
        else        sum[i]=sum[i-1]+prime[i];
    }
}

int main()
{
//    freopen("in.txt","r",stdin);
    init();
    while(scanf("%d",&n)!=EOF&&n)
    {
        int s=0,e=1,ans=0;
        while(e<cnt)
        {
            int val=sum[e]-sum[s];
            if(val==n)  ans++;
            if(val>n)   s++;
            else        e++;
            if(s==e)    e++;
        }
        printf("%d\n",ans);
    }
    return 0;
}
View Code

 

posted on 2018-07-30 10:34  我过了样例耶  阅读(115)  评论(0编辑  收藏  举报

导航