最强素数(UPC新生训练赛12)

题目描述

小李在你帮助之下轻松战胜了他的同学们,于是满怀恶意的同学出了一个题目来为难小李,作为小李神一样的队友,你又要出力了。
素数41能写成连续6个素数之和:41=2+3+5+7+11+13。
现在要求n以内的素数中,能表示为最多连续素数之和的那个数,如果有多个答案,请输出最大的那个素数。

输入

仅一行,一个整数n(1<=n<=1000000)。

输出

输出就一个整数,为所求的能表示为最多连续素数和的那个素数。 

样例输入 Copy
100
样例输出 Copy
41
提示

41=2+3+5+7+11+13

代码实现:

#pragma GCC optimize(2)
#include
using namespace std;
int st[1000010];
int prime[1000010];
int pin[1000010];
int cnt=0;
long long sum[1000010];
void pd(int n)
{
    for(int i=2;i<=n;i++)
    {
        if(!st[i])
        {
            prime[cnt++]=i;
        }
        for(int j=0;prime[j]<=n/i;j++)
        {
            st[prime[j]*i]=1;
            if(i%prime[j]==0)
            {
                break;
            }
        }
    }
}
int main()
{
    int n;
    cin>>n;
    pd(1000000);
    long long res=0;
    int maxn=0;
    long long ans=0;
    cnt=5133;
    for(int i=1;i<=cnt;i++)
    {
        sum[i]=sum[i-1]+prime[i-1];
    }
    for(int i=0;i<=cnt;i++)
    {
        for(int j=i+1;j<=cnt;j++)
        {
            long long k=sum[j]-sum[i];
            if(k<=n&&st[k]==0)
            {
                if(j-i>maxn)
                {
                    maxn=j-i;
                    ans=max(ans,k);
                }
                else if(j-i==maxn)
                {
                    ans=max(ans,k);
                }
            }
        }
    }    
    cout<     return 0;
}

你可能感兴趣的:(算法,c++)