码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2689 Prime Distance

时间:2018-03-07 13:34:52      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:bre   max   markdown   str   情况   span   prime   math   down   

筛法的应用

因为直接算是不可能的,
我们可以处理出 \[ 1~\sqrt n \]的所有质数,然后筛掉\[L~R\] 区间内的所有质数
注意:
线性筛的时候,注意n与数组大小的关系,防止RE
与素数有关的一定要特判1的情况

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;
const int MAXN = 75000;
ll l, r, prime[MAXN + 5], cnt;
bool f[MAXN + 5], fff[1000055];
void Euler_chk() {
    f[1] = 1;
    for(int i = 2 ; i < MAXN ; i++) {
        if(!f[i]) {
            prime[++cnt] = i;
        }
        for(int j = 1 ; i * prime[j] < MAXN; j++) {
            f[i * prime[j]] = 1;
            if(!(i % prime[j])) break;
        }
    }
}
int main() {
    Euler_chk();
    while(cin>>l>>r) {
        memset(fff, 0, sizeof(fff));
        for(int i = 1 ; i <=cnt && prime[i] <= r / 2 ; i++) {
            if(!(l % prime[i]) && prime[i] < l) fff[0] = 1;
            if(prime[i] < l) for(int j = floor((double)l / prime[i]) + 1; j <= floor((double)r / prime[i]) ; j++) {
                fff[j * prime[i] - l] = 1;
            }else for(int j = 2; j <= floor((double)r / prime[i]) ; j++) {
                fff[j * prime[i] - l] = 1;
            }
        }
        if(l == 1) fff[0] = 1;
        //for(int i = 0 ; i <= (r - l) ; i++) printf("%d",fff[i]);
        //printf("\n");
        int ans1 = 0, ans2 = 0, l1 = 0, l2 = 0, r1 = 0, r2 = 0;
        int head = 0, tail = 0;
        while(fff[head] && head <= (r - l)) head++;
        if(head > (r - l)) {printf("There are no adjacent primes.\n");continue;}
        tail = head + 1;
        while(fff[tail] && tail <= (r - l)) tail++;
        if(tail > (r - l)) {printf("There are no adjacent primes.\n");continue;}
        ans1 = ans2 = tail - head;
        l1 = l2 = head + l;
        r1 = r2 = tail + l;
        while(head <= tail && tail <= (r - l)) {
            //printf("%d %d\n", head + l, tail + l);
            head = tail;tail++;
            while(fff[tail] && tail <= (r - l)) tail++;
            if(tail > (r - l)) break;
            if((tail - head) > ans1) {
                ans1 = tail - head;
                l1 = head + l;
                r1 = tail + l;
            }
            if((tail - head) < ans2) {
                ans2 = tail - head;
                l2 = head + l;
                r2 = tail + l;
            }
        }
        printf("%d,%d are closest, %d,%d are most distant.\n", l2, r2, l1, r1);
    }
    return 0;
}

POJ 2689 Prime Distance

标签:bre   max   markdown   str   情况   span   prime   math   down   

原文地址:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8521488.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!