第八屆藍橋杯【省賽試題2】等差素數列
阿新 • • 發佈:2019-02-15
題目描述:
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; }