题目背景
在遥远的阿拉德大陆,有一种神秘的磁石,是由魔皇制作出来的,
题目描述
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; } } }