UVA1210 连续素数之和 Sum of Consecutive Prime Numbers

题意

给你一个数,询问有多少个连续质数序列和等于该数。

分析

首先打一个素数表,计算每一段素数的和,用一个数组记录每一个和有多少段连续的素数和能凑成,预处理好每一个和对应的答案,直接输出即可。时间复杂度: \(O(n^2)\)

代码

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e4+7;
int n,ans[MAXN],pre[MAXN];
vector<int>prime;
bool isprime[MAXN];
void sieve()
{
    for(int i=0;i<=MAXN;i++)
    {
        isprime[i]=true;
    }
    isprime[0]=isprime[1]=false;
    for(int i=2;i<=MAXN;i++)
    {
        if(isprime[i])
        {
            for(int j=2*i;j<=MAXN;j+=i)
            {
                isprime[j]=false;
            }
        }
    }
}
int mp[MAXN*MAXN];
int main()
{
    sieve(); //埃筛
    int i,j,k;
    for(i=0;i<=MAXN;i++)
    {
        if(isprime[i]) prime.push_back(i); //打素数表
    }
    pre[0]=prime[0];
    int m=prime.size();
    for(i=1;i<m;i++)
    {
        pre[i]=pre[i-1]+prime[i]; //p[i]表示前i个素数的和
    }
    for(i=0;i<m;i++)
    {
        for(j=i;j<m;j++)
        {
            int x=pre[j]-pre[i-1]; //从第i个素数到第j个素数的和
            mp[x]++; //mp[x]表示和为x的连续素数的段数
        }
    }
    while(~scanf("%d",&n)&&n)
    {
        printf("%d\n",mp[n]);
    }
    return 0;
}
posted @ 2022-02-18 11:08  l_x_y  阅读(106)  评论(0编辑  收藏  举报