7-7 最强素数(100 分) 【前缀和】
2018-03-29 10:14
465 查看
7-7 最强素数(100 分)
小李在你帮助之下轻松战胜了他的同学们,于是满怀恶意的同学出了一个题目来为难小李,作为小李神一样的队友,你又要出力了。 素数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
思路
先用 素数筛法 把素数筛出来
然后分别用两个 vector 保存 素数 和 前缀和
然后二分查找 第一个 <= n 的素数 这个就是 上界
然后枚举每一种情况 符合的话 就更新答案就可以了
AC代码
小李在你帮助之下轻松战胜了他的同学们,于是满怀恶意的同学出了一个题目来为难小李,作为小李神一样的队友,你又要出力了。 素数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
思路
先用 素数筛法 把素数筛出来
然后分别用两个 vector 保存 素数 和 前缀和
然后二分查找 第一个 <= n 的素数 这个就是 上界
然后枚举每一种情况 符合的话 就更新答案就可以了
AC代码
#include <cstdio> #include <cstring> #include <ctype.h> #include <cstdlib> #include <cmath> #include <climits> #include <ctime> #include <iostream> #include <algorithm> #include <deque> #include <vector> #include <queue> #include <string> #include <map> #include <stack> #include <set> #include <numeric> #include <sstream> #include <iomanip> #include <limits> #define CLR(a) memset(a, 0, sizeof(a)) #define pb push_back using namespace std; typedef long long ll; typedef long double ld; typedef unsigned long long ull; typedef pair <int, int> pii; typedef pair <ll, ll> pll; typedef pair<string, int> psi; typedef pair<string, string> pss; const double PI = 3.14159265358979323846264338327; const double E = exp(1); const double eps = 1e-30; const int INF = 0x3f3f3f3f; const int maxn = 1e6 + 5; const int MOD = 1e9 + 7; bool isprime[maxn]; vector <ll> v, vv; void init() { memset(isprime, true, sizeof(isprime)); isprime[0] = false; isprime[1] = false; int i, j; for (i = 2; i<maxn; i++) { if (isprime[i]) { v.pb(i); int len = vv.size(); ll n = i; if (len) n += vv[len - 1]; vv.pb(n); for (j = i * 2; j<maxn; j += i) { isprime[j] = false; } } } } int main() { init(); int n; scanf("%d", &n); int add = upper_bound(v.begin(), v.end(), n) - v.begin(); add--; ll ans = 0, tot = 0; for (int i = 0; i <= add; i++) { if (vv[i] > n) break; if (isprime[vv[i]]) { ans = vv[i]; tot = i + 1; } } for (int i = 0; i <= add; i++) { for (int j = i; j <= add; j++) { ll sum = vv[j] - vv[i]; if (sum > n) break; if (isprime[sum]) { if (j - i > tot || ((j - i) == tot && sum > ans)) { ans = sum; tot = j - i; } } } } cout << ans << endl; }
相关文章推荐
- 最强素数(100 分)
- 打印100~200 之间的素数
- 输出100与200之间的素数
- java求100以内的素数
- 求100到200之间的素数
- 打印100-200之间的素数
- 用筛选法求100以内的素数问题
- C程序设计 例题5.10求100-200间的所有素数
- 求出100以内的素数,并将这些书在屏幕上5个一行地显示出来。
- 100以内的素数
- 打印出100以内的素数
- [pascal]对“求1-100之间的所有素数”的三种不同循环结构算法的分析
- 打印100~200之间的素数
- 100以内 素数
- 求100-200之间的素数
- 求100~200的素数
- hdu 5317 RGCDQ(素数筛选法+前缀和)
- 1.打印100~200之间的素数/2.判断1000年-2000年之间的闰年
- java 求100以内的素数
- 用“埃氏筛法”求2~100以内的素数。2~100以内的数,先去掉2的倍数,再去掉3的倍数,再去掉5的倍数,……依此类推