头像

Cyan

四川成都

深度强化学习炼丹师

2017年第八届蓝桥杯省赛-B.等差素数列

2017年第八届蓝桥杯省赛-B.等差素数列

2022-02-19 · 100次阅读 · 原创 · 数据结构与算法

原题链接

题面

2,3,5,7,11,13,… 是素数序列。 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。

上边的数列公差为 30,长度为 6。

2004 年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。 这是数论领域一项惊人的成果!

有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:

长度为 10 的等差素数列,其公差最小值是多少?

题解

素数筛,枚举

利用 埃式筛 预处理出素数数组,然后暴力枚举公差和首项,注意首项必须为素数,则直接枚举素数数组即可。

具体见代码。

答案:

210

代码

#include<bits/stdc++.h> using namespace std; const int N = 1e5 + 5; bool p[N]; vector<int> primes; //素数筛 // 将 1 - n 中的所有素数存入 primes 中,并且 p[i] 表示 i 是否为素数 void do_primes(int n) { memset(p, true, sizeof p); p[0] = p[1] = false; for (int i = 2; i <= n; i++) { if (p[i]) { primes.push_back(i); for (int j = 2 * i; j <= n; j += i) p[j] = false; } } } int main() { int n = 1e5; do_primes(n); //预处理素数 for (int d = 1; d * 9 <= n; d++) { //从小到大枚举 公差 for (int i = 0; i < primes.size() && primes[i] + d * 9 <= n; i++) { //枚举首项 int k = 1, t = primes[i] + d; while (t <= n && p[t]) { t += d; k++; } if (k == 10) { //有10项,则满足要求,则输出答案,退出程序 printf("%d\n", d); exit(0); } } } return 0; }

标题: 2017年第八届蓝桥杯省赛-B.等差素数列
链接: https://www.fightingok.cn/detail/195
更新: 2022-09-18 22:47:13
版权: 本文采用 CC BY-NC-SA 3.0 CN 协议进行许可