题目背景
在遥远的阿拉德大陆,有一种神秘的磁石,是由魔皇制作出来的,
题目描述
- 若给他一个一维坐标系,那么他的磁力一定要在素数坐标的位置上才能发挥的最大(不管位置坐标的大小,只要是素数那么磁力就一样大)。
- 若两个磁石相距为 k,那么磁石间的破坏力将会达到当前磁力的峰值
显然,两磁石间最大破坏力取决于磁力大小和磁石间距,那么请问给出长度不超过 n 的一维坐标系,有哪几对坐标间磁石破坏力最大。
输入格式
两个正整数 n,k。
输出格式
所有小于等于 n 的素数对。每对素数对输出一行,中间用单个空格隔开。若没有找到任何素数对,输出 empty
。
输入输出样例
输入 #1
6924 809
输出 #1
2 811
说明/提示
对于 100%的数据,1≤k≤n≤10000。
思路
题目的意思就是说,如果当前的坐标(num)为素数,而且(num+k)也为素数,那么它的破坏力就能达到峰值,在这时候我们就输出 num 和 num+k 就可以了. 如果找不到这样的素数对,输出empty.
AC代码
#include <bits/stdc++.h>
using namespace std;
int n,k,flag=0;
bool pd(int x) //判断x是否为素数.若x为素数,则返回1,若不是,则返回0.
{
bool p=1;
for(int i=2;i<x;i++)
{
if(x%i==0)
{
p=0;
break;
}
}
if(p==0) return 0;
else return 1;
}
void dfs(int num)
{
if(num>n-k) return; //无需遍历到n,只需要到n-k就可以.
if(pd(num)==1 && num+k<=n && pd(num+k)==1)
{
flag=1;
cout<<num<<" "<<num+k<<" "<<endl;
}
dfs(num+1);
}
int main()
{
cin>>n>>k;
dfs(2); //因为1不是素数,所以直接从2开始.
if(flag==0) cout<<"empty"<<endl;
return 0;
}
测试点信息