质数筛 nbut1454 Lux

传送门:点击打开链接

题意:给出区间[L,R],R-L<=1e6,求区间中相邻质数之差的最大值和最小值,如果不存在两个质数,就输出-1

思路:筛[L,R]区间中的全部质数,然后再遍历一遍

#include<map>
#include<set>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w+",stdout)
using namespace std;
typedef long long LL;
typedef pair<int, int>PII;

const int MX = 1e6 + 5;
const int INF = 0x3f3f3f3f;

bool sign[MX];
int subprim[MX], prim[MX], totleprm = 0;

void getprim(int n) {
    memset(sign,0,sizeof(sign));

    sign[1] = 1;
    for(int i = 2; i <= n; i++) {
        if(sign[i]) continue;
        prim[totleprm++] = i;

        if((LL)i * i > n) continue;
        for(int j = i * i; j <= n; j += i) {
            sign[j] = 1;
        }
    }
}

int getSubPrim(int a, int b) {
    int totl = 0, i;LL j;
    memset(sign, true, sizeof(sign));

    if(a < 2) a = 2;
    LL l = b - a + 1;
    for(i = 0; i < totleprm; i++) {
        if((j = prim[i] * (a / prim[i])) < a) j += prim[i];
        if(j < prim[i]*prim[i]) j = prim[i] * prim[i];
        for(; j <= b; j += prim[i]) sign[j - a] = false;
    }
    for(i = 0; i < l; i++) if(sign[i]) {
            subprim[totl++] = a + i;
        }
    return totl;
}

int main() {

    getprim(100000);
    int L, R;//FIN;
    while(~scanf("%d%d", &L, &R)) {
        int MinL = 0, MinR = INF, MaxL = 0, MaxR = 0;
        int rear = getSubPrim(L, R);
        if(rear < 2) {
            printf("-1\n");
            continue;
        }

        for(int i = 0; i < rear - 1; i++) {
            if(MinR - MinL > subprim[i + 1] - subprim[i]) MinL = subprim[i], MinR = subprim[i + 1];
            if(MaxR - MaxL < subprim[i + 1] - subprim[i]) MaxL = subprim[i], MaxR = subprim[i + 1];
        }
        printf("%d %d %d %d\n", MinL, MinR, MaxL, MaxR);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 23:05:48

质数筛 nbut1454 Lux的相关文章

质数筛(洛谷1865 A % B Problem)

题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m 接下来n行,每行两个整数 l,r 表示区间 输出格式: 对于每次询问输出个数 t,如l或r∉[1,m]输出 Crossing the line 输入输出样例 输入样例#1: 2 5 1 3 2 6 输出样例#1: 2 Crossing the line 说明 [数据范围和约定] 对于20%的数据 1<=n<=10 1<=m<=10 对于100%的数据 1<=n<=1000 1<=m

poj2739(尺取法+质数筛)

题意:给你一个数,问这个数能否等于一系列连续的质数的和: 解题思路:质数筛打出质数表:然后就是尺取法解决: 代码: #include<iostream> #include<algorithm> #include<cstring> #define maxn 1000005 using namespace std; int visit[maxn];int prime[maxn]; void qprime() { memset(visit,0,sizeof(visit));

[题解](区间质数筛)POJ_2689 Prime Distance

区间筛素数:先筛出1~sqrt(R)的素数,然后对于每个询问只要用这些素数筛掉区间内的合数即可. 几个细节:1.特判和1有关的一些情况 2.每次减去L偏移量,数组只开区间大小 3.POJ无法使用万能头文件(需要火星救援(大雾 #include<iostream> #include<cstdio> #include<cstring> using namespace std; int prime[50009]; bool ck[1000009],tmp[1000009];

51Nod - 1181 质数中的质数(质数筛法)

如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数.例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数.现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做). Input输入一个数N(N <= 10^6)Output输出>=N的最小的质数中的质数.Sample Input 20 Sample Output 31 用eular质数筛即可 1 #include<iostream> 2 #include<cstdio>

[经典算法] Eratosthenes筛选求质数

题目说明: 除了自身之外,无法被其它整数整除的数称之为质数,要求质数很简单,但如何快速的求出质数则一直是程式设计人员与数学家努力的课题,在这边介绍一个著名的 Eratosthenes求质数方法. 题目解析: 首先知道这个问题可以使用回圈来求解,将一个指定的数除以所有小于它的数,若可以整除就不是质数,然而如何减少回圈的检查次数?如何求出小于N的所有质数?首先假设要检查的数是N好了,则事实上只要检查至N的开根号就可以了,道理很简单,假设A*B = N,如果A大于N的开根号,则事实上在小于A之前的检查

积性函数,线性筛入门 HDU - 2879

HDU - 2879HeHe 题意:He[N]为[0,N−1]范围内有多少个数满足式子x2≡x (mod N),求HeHe[N]=He[1]×……×He[N] 我是通过打表发现的he[x]=2k,k为x是质因子个数,不过这是可以通过积性函数证明的. 关于积性函数的定义: 对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时,f(ab)=f(a)f(b),在数论上就称它为积性函数.若对于某积性函数 f(n) ,就算a, b不互质,也有f(ab)=f(a)f(b),则称它为完全积性

反素数 -- 数学

反素数就是区间内约数个数最多的那个数. 在ACM题目里, 一般是求约数最多而且数字最小的那个数,[1--n] 二是求约数刚好等于n的最小的那个数 三是求区间里的最小反素数[beign,end] 1和3有区别吗?有,1可以加速,3只能暴力 先说下思路 思路 : 官方题解 : (1)此题最容易想到的是穷举,但是肯定超时. (2)我们可以知道,计算约数的个数和质因数分解有着很大的联系: 若Q的质因数分解为:Q=p1^k1*p2^k2*…*pm^km(p1…pm为素数,k1…km≥1),则Q有(k1+1

【数论算法基础理论与实现】

[题目太正式了我还怎么写ヾ|≧_≦|"] [很简要] [参考文献:<算法导论>.白书.天宇哥哥课件] 1.基础 [除法定理]:对于任何整数a和正整数n,存在唯一整数q和r,满足0<=r<n且a=qn+r   WARN:C++中貌似不完全遵守这个东西,n认为是|n|,并且a为负时r可以为负 []  2.最大公约数 几条性质:gcd(a,b)=gcd(|a|,|b|) gcd(a,0)=|a| gcd(a,ka)=|a|   gcd(a,b)=gcd(b,a mod b) -

java 经典算法(转)

1.河内之塔.. 2.Algorithm Gossip: 费式数列. 3. 巴斯卡三角形 4.Algorithm Gossip: 三色棋 5.Algorithm Gossip: 老鼠走迷官(一) 6.Algorithm Gossip: 老鼠走迷官(二) 7.Algorithm Gossip: 骑士走棋盘 8.Algorithm Gossip: 八皇后 9.Algorithm Gossip: 八枚银币. 10.Algorithm Gossip: 生命游戏. 11.Algorithm Gossip: