您的位置:首页 > 其它

最强素数(100 分)

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

输入格式:

仅一行,一个整数n。

输出格式:

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

输入样例:

100

输出样例:

41
【样例说明】 41=2+3+5+7+11+13 【数据规模】 30%的数据,1<=n<=1000 60%的数据,1<=n<=10000 80%的数据,1<=n<=100000 100%的数据,1<=n<=1000000
由于看到时间限制是10000ms,所以一开始大胆采用了暴力O(n^2)做法,结果居然就过了……首先先用个素数筛法算出所有素数并且存在一个prime数组里方便后面使用。找出prime数组里不大于n的最大素数的下标,接着暴力枚举prime[0]~prime[a]里的所有组合,得到答案。#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <stack>
#include <string>
#include <queue>
#include <set>
#include <list>
using namespace std;
const int MAX_SIZE = 1000000 + 10;
int p[MAX_SIZE], prime[MAX_SIZE], save[MAX_SIZE], t;
void fun() {
t = 0;
memset(p, 0, sizeof p);
for (int i = 2; i <= sqrt(MAX_SIZE); i++) {
if (p[i]) continue;
for (int j = i * i; j < MAX_SIZE; j += i) p[j] = 1;
}
for (int i = 2; i < MAX_SIZE; i++)
if (!p[i]) prime[t++] = i;
}
int main() {
fun();
int n, a, max_cnt = 0;
cin >> n;
for (a = 0; a < t; a++)
if (prime[a] > n) break;
save[1] = prime[a - 1];
for (int i = 0; i < a; i++) {
int tmp = 0;
for (int j = i; j < a; j++) {
tmp += prime[j];
if (tmp > n) break;
if (!p[tmp]) {
save[j - i + 1] = max(tmp, save[j - i + 1]);
max_cnt = max(j - i + 1, max_cnt);
}
}
}
cout << save[max_cnt] << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: