luogu P2640 神秘磁石| 线性筛素数

题目描述

1.若给他一个一维坐标系,那么他的磁力一定要在素数坐标的位置上才能发挥的最大(不管位置坐标的大小,只要是素数那么磁力就一样大)

2.若两个磁石相距为k,那么磁石间的破坏力将会达到当前磁力的峰值

显然,两磁石间最大破坏力取决于磁力大小和磁石间距,那么请问给出长度不超过n的一维坐标系,有哪几对坐标间磁石破坏力最大。

输入格式

两个正整数n,k。1<=k<=n<=10000

输出格式

所有小于等于n的素数对。每对素数对输出一行,中间用单个空格隔开。若没有找到任何素数对,输出empty。


1-n里面找所有差为k的素数对

直接筛素数,逐一判断就好了

天天考数论,再不好好练练数论就会被虐死

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define db double
#define int long long
const int N=2e5+10;
bool vis[N];
int n,k;
inline void primes(){
	for(int i=2;i<=n;i++){
		if(vis[i])continue;
		for(int j=i;j<=n/i;j++)vis[j*i]=1;
	}
}
signed main(){
	cin>>n>>k;
	primes();
	bool op=1;
	for(int i=2;i+k<=n;i++)
	if(!vis[i]&&!vis[i+k]){
		printf("%d %d\n",i,i+k);
		op=0;
	}
	if(op)printf("empty\n");
}
posted @ 2019-10-28 15:24  白木偶君  阅读(120)  评论(0编辑  收藏  举报