等差素数数列-蓝桥杯
等差素数列 2,3,5,7,11,13,....是素数序列。 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为 30,长度为 6。 2004 年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。 这是数论领域一项惊人的成果! 有这一理论为基础,请你借助手中的计算机,满怀信心地搜索: 长度为 10 的等差素数列,其公差最小值是多少? 注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字。
答案:210
题解:枚举公差,等差数列一定满足通项公式:An=a1+(n-1)*d,三个for循环,分别枚举a1,d,n就行了
#include<iostream> #include<string.h> #include<algorithm> #include<math.h> #include<vector> using namespace std; int a[1000005],vis[1000005]; vector<int>p; int main() { memset(vis,0,sizeof(0)); int n,t=1; cin>>n; a[0]=2; for(int i=3;i<=n;i=i+2) { int j,mid; mid=sqrt(i); for(j=3;j<=mid;j=j+2) { if(i%j==0) break; } if(j>mid) { a[t]=i; vis[a[t]]=1; t++; } } for(int i=0;i<t;i++) { for(int d=1;d<1000;d++) { for(int x=1;x<=10;x++) { if(vis[a[i]+(x-1)*d]) { if(x==10) { p.push_back(d); break; } } else break; } } } sort(p.begin(),p.end()); for(vector<int>::iterator it=p.begin();it!=p.end();it++) { cout<<*it<<endl; } //system("pause"); return 0; }
等风起的那一天,我已准备好一切