1. 程式人生 > >洛谷P2640 神秘磁石(歐拉篩法)

洛谷P2640 神秘磁石(歐拉篩法)

for names pty AI 註意 坐標 class 長度 syn

題目背景

在遙遠的阿拉德大陸,有一種神秘的磁石,是由魔皇制作出來的,

題目描述

1.若給他一個一維坐標系,那麽他的磁力一定要在素數坐標的位置上才能發揮的最大(不管位置坐標的大小,只要是素數那麽磁力就一樣大)

2.若兩個磁石相距為k,那麽磁石間的破壞力將會達到當前磁力的峰值

顯然,兩磁石間最大破壞力取決於磁力大小和磁石間距,那麽請問給出長度不超過n的一維坐標系,有哪幾對坐標間磁石破壞力最大。

輸入輸出格式

輸入格式:

兩個正整數n,k。1<=k<=n<=10000

輸出格式:

所有小於等於n的素數對。每對素數對輸出一行,中間用單個空格隔開。若沒有找到任何素數對,輸出empty。

題解

篩出從1到n的所有素數,並存到一個數組中。同時開一個bool數組記錄是否是素數。循環素數數組,判斷當前項加k是否也是素數。同時要註意判斷是否有符合條件的結果,若沒有則輸出empty

#include<bits/stdc++.h>
using namespace std;
const int maxn=10002;
bool flag[maxn];     //記錄是否是素數    
int s[maxn];         //記錄所有素數
int s2=1;            //記錄素數個數
void e(int n);       //篩法
int main()
{
    ios::sync_with_stdio(
false); memset(flag,true,sizeof(flag)); bool bo=false; flag[1]=false; int n,k; cin>>n>>k; e(n); for(int i=1;i<=s2+1;i++) { int y=s[i]+k; if(y>n) break; if(flag[y]==true) { cout<<s[i]<<"
"<<y<<endl; bo=true; } } if(bo==false) cout<<"empty"; return 0; } void e(int n) { for(int i=2;i<=n;i++) { if(flag[i]==true) { s[s2]=i; s2++; } for(int j=1;j<=s2+1;j++) { int k=s[j]*i; if(k>n) break; flag[k]=false; if(i%s[j]==0) break; } } }

洛谷P2640 神秘磁石(歐拉篩法)