等差素数列
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
2,3,5,7,11,13,…是素数序列。 类似:7,37,67,97,127,157这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为 30,长度为 6。
2004 年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。 这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为 10 的等差素数列,其公差最小值是多少?
这题目是蓝桥杯一次省赛b组的一道天空题,我们只需要把素数都筛选出来,然后从小到大枚举公差就行了,当然这里的细节得注意,如果很久没有转出来的话,可以尝试二分一下公差,这里说的二分指的是手动输入,当然这题目很快就可以算出来,因此不需要二分了。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=1e7+10;
int primes[N],cnt;
bool st[N];
void init(int n)
{
for(int i=2;i<=n;i++)
{
if(!st[i])primes[cnt++]=i;
for(int j=0;primes[j]*i<=n;j++)
{
st[i*primes[j]]=true;
if(i%primes[j]==0)break;
}
}
}
int main()
{
int n;//输入1e5就可以得到答案210
cin>>n;
init(n);
for(int d=2;d<n;d++)
{
for(int a=0;a<cnt;a++)
{
bool flag=true;
int x=primes[a];
vector<int> res;
for(int a1=x;a1<=x+9*d;a1+=d)
{
res.push_back(a1);
if(a1>n||st[a1]==true)
{
flag=false;
break;
}
}
if(flag==true)
{
cout<<d<<endl;
for(auto c:res)cout<<c<<" ";
return 0;
}
}
}
return 0;
}