zoukankan      html  css  js  c++  java
  • POJ 2689 Prime Distance

    筛法的应用

    因为直接算是不可能的,
    我们可以处理出 $$ 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("
    ");
    		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.
    ");continue;}
    		tail = head + 1;
    		while(fff[tail] && tail <= (r - l)) tail++;
    		if(tail > (r - l)) {printf("There are no adjacent primes.
    ");continue;}
    		ans1 = ans2 = tail - head;
    		l1 = l2 = head + l;
    		r1 = r2 = tail + l;
    		while(head <= tail && tail <= (r - l)) {
    			//printf("%d %d
    ", 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.
    ", l2, r2, l1, r1);
    	}
    	return 0;
    }
    
  • 相关阅读:
    mangodb学习0.1 概念
    express 学习笔记(一)路由
    vue配置路由
    screenX, clientX, pageX
    svg的世界、视窗、视野
    window.print()打印网页(一)
    cookie基础
    BOM基础
    Java三大特征:封装 继承 多态
    面向对象
  • 原文地址:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8521488.html
Copyright © 2011-2022 走看看