当前位置: 代码迷 >> 综合 >> 第八届蓝桥杯【省赛试题2】等差素数列
  详细解决方案

第八届蓝桥杯【省赛试题2】等差素数列

热度:23   发布时间:2023-10-09 15:26:14.0

题目描述:

2,3,5,7,11,13,....是素数序列。
类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为30,长度为6。
2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。
这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为10的等差素数列,其公差最小值是多少?
注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字。

题目答案:

210

题目思路:

素数筛选出100000以内的素数,暴力枚举,如果没有答案,那么就将范围扩大。

题目代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#define N 100001
using namespace std;
// p[i]表示第i个素数
// dp[i] = 1 表示i是合数,=0表示是素数 
int p[N], tot = 0;
int dp[N];void table(){memset(dp, 0, sizeof(dp));dp[0] = dp[1] = 1;for(long long i = 2; i < N; i++){if(dp[i]) continue;p[tot++] = i;for(long long j = i; j * i < N; j++){dp[i*j] = 1;}} 
}int main(){table();printf("%d\n",tot);for(int i = 1; i < 500; i++){ // 差 for(int j = 0; j < tot; j++){ // 起始位置 int flag = 1;for(int k = j; k < j+10 ; k++){  // 区间长度10 if(dp[p[j]+(i*(k-j))] || p[j]+(i*(k-j)) >= N ){flag = 0; // 起始位置素数加上差后不是素数 break;    // 或加上差后超出范围 flag = 0; }}if(flag){				printf("p[j]:%d j:%d i:%d\n",p[j],j,i);break;}}}return 0;
} 


  相关解决方案