# 等差素数列
2,3,5,7,11,13,....是素数序列。
类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为30,长度为6。
2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。
这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为10的等差素数列,其公差最小值是多少?
以下选项错误的是?
## aop
### before
```c
#include
using namespace std;
```
### after
```c
```
## 答案
```c
const int N = 10010;
int k;
int prime[N];
bool st[N], check[N];
void init()
{
for (int i = 2; i < N; i++)
if (!st[i])
{
prime[k++] = i;
check[i] = true;
for (int j = i + i; j < N; j += i)
st[j] = true;
}
}
int main()
{
init();
for (int i = 1; i < N; i++)
for (int j = 0; j < k; j++)
{
int k = prime[j], cnt = 1;
while (check[k + i])
{
k += i;
if (cnt++ == 10)
{
cout << i << endl;
return 0;
}
}
}
}
```
## 选项
### A
```c
typedef long long ll;
const ll maxn = 1e6 + 50;
ll a[maxn];
bool ok(ll n, ll cha)
{
for (ll i = 0; i < 10; i++)
{
if (!a[n + i * cha])
return 0;
}
return 1;
}
int main()
{
a[1] = 0;
a[2] = 1;
a[3] = 1;
for (ll i = 4; i <= 1000000; i++)
{
bool flag = 0;
for (ll j = 2; j * j <= i; j++)
{
if (i % j == 0)
{
flag = 1;
break;
}
}
if (flag)
a[i] = 0;
else
a[i] = 1;
}
for (ll cha = 1;; cha++)
{
for (ll i = 2; i < 1000000; i++)
{
if (a[i] && ok(i, cha))
{
printf("%lld\n", cha);
return 0;
}
}
}
}
```
### B
```c
const int N = 10001;
int prime[N]{0};
int main()
{
for (int i = 2; i != N; ++i)
prime[i] = 1;
for (int i = 2; i < N; ++i)
{
for (int j = i + 1; j < N; ++j)
{
if (j % i == 0)
{
if (prime[j] == 1)
prime[j] = 0;
}
}
}
for (int d = 1; d <= 300; ++d)
{
for (int i = 2; i < N; ++i)
{
int a1 = i, flag = 1, len = 1;
while (len < 10)
{
if (prime[a1 + len * d] == 0)
{
flag = 0;
break;
}
else
{
++len;
}
}
if (flag)
{
cout << d << endl;
break;
}
}
}
return 0;
}
```
### C
```c
typedef long long LL;
set all;
bool isPrimt(LL t)
{
for (int i = 2; i < t / 2; ++i)
{
if (t % i == 0)
return false;
}
return true;
}
int f(LL a[], int n)
{
for (int i = 0; i < n; ++i)
{
LL first = a[i];
for (int delta = 1; delta < a[n] - first; ++delta)
{
int m = first;
for (int j = 1; j < 10; ++j)
{
m += delta;
if (all.find(m) == all.end())
break;
if (j == 9)
return delta;
}
}
}
return -1;
}
const int N = 5000;
int main()
{
LL a[N];
a[0] = 2;
a[1] = 3;
all.insert(2);
all.insert(3);
int index = 2;
LL t = 5;
while (index < N)
{
if (isPrimt(t))
{
a[index++] = t;
all.insert(t);
}
t++;
}
printf("%d\n", f(a, N));
return 0;
}
```