模板——区间筛法

原博文http://www.cnblogs.com/nowandforever/p/4515612.html

/************************************************
* Author        :Powatr
* Created Time  :2015-8-17 8:56:45
* File Name     :区间筛法.cpp
 ************************************************/

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int MAXN = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;

bool is_prime_small[MAXN];
bool is_prime[MAXN];
ll prime[MAXN];
ll cout1;

void segment_sieve (ll a, ll b)
{
    for(ll i = 0 ; i*i < b; i++) is_prime_small[i] = true;
    for(ll i = 0 ; i < b - a; i++) is_prime[i] = true;
    for(ll i = 2; i*i < b; i++){
        if(is_prime_small[i]){
            for(ll j = 2*i; j *j < b; j+=i) is_prime_small[j] = false;
            for(ll j = max(1ll*2, (a+i-1)/i*i); j < b; j+=i) is_prime[j-a] = false;
        }
    }
    for(ll i = 0; i < b - a; i++){
        if(is_prime[i]) prime[++cout1] = i+a;
    }
}

int main(){
    ll a, b;
    while(~scanf("%I64d%I64d", &a, &b)){
    cout1 = 0;
    memset(prime, 0, sizeof(prime));
    segment_sieve(a, b);
    printf("%I64d\n", cout1);
    }
    return 0;
}

  

时间: 2024-11-05 11:54:00

模板——区间筛法的相关文章

POJ2689——区间筛法——Prime Distance

http://poj.org/problem?id=2689 /* 区间筛法适用于L, R范围比较大,但是区间长度较小时 套个模板然后取出最小最大就可以 */ /************************************************ * Author :Powatr * Created Time :2015-8-17 9:38:50 * File Name :POJ2689.cpp ********************************************

POJ 2689 Prime Distance(素数区间筛法--经典题)

大致题意:给定[L,R]区间,找出区间内的每个素数 数据范围 : 1<=L< R<=2,147,483,647) R-L <=1,000,000. R的数值太大,所以不能直接筛[0,R]的,要空间和时间优化,用到区间筛法,另外注意不能用int,因为R和L都是满int的,中间有很多细节处理会爆int的,还要注意1不是素数,所以在区间筛中要特判一下,是个易错的地方 //1160K 16MS C++ 1539B #include<cstdio> #include<ios

二维树状数组模板(区间修改+区间查询)

二维树状数组模板(区间修改+区间查询) 例题:JOIOI上帝造题的七分钟 一共两种操作: \(L\ x_1\ y_1\ x_2\ y_2\ d\):把\((x_1,y_1)\),\((x_2,y_2)\)这个矩形内所有元素加\(d\). \(k\ x_1\ y_1\ x_2\ y_2\):查询\((x_1,y_1)\),\((x_2,y_2)\)这个矩形内所有元素的和. 代码如下: #include<bits/stdc++.h> #define RG register #define IL i

POJ-2689-Prime Distance(素数区间筛法)

链接: https://vjudge.net/problem/POJ-2689 题意: The branch of mathematics called number theory is about properties of numbers. One of the areas that has captured the interest of number theoreticians for thousands of years is the question of primality. A

区间筛法

2016.1.26 主体思想与前面两种筛法一致,但一般题目中数据范围比较大(a<b<=10^12),但也有个利于我们的限制条件(b-a<=10^6) 那就很简单了,根据我们熟知的理论,b以内的合数的最小质因数不会大于√b,所以我们就可以筛出[1,√b]内的素数并用这些素数去筛除[a,b]的合数. 典型例题:区间内素数的个数

[线段树模板] 区间修改 区间查询(详注)

输入 每个测试点(输入文件)有且仅有一组测试数据. 每组测试数据的第1行为一个整数N,意义如前文所述. 每组测试数据的第2行为N个整数,分别描述每种商品的重量,其中第i个整数表示标号为i的商品的重量Pi. 每组测试数据的第3行为一个整数Q,表示小Hi进行的操作数. 每组测试数据的第N+4~N+Q+3行,每行分别描述一次操作,每行的开头均为一个属于0或1的数字,分别表示该行描述一个询问和一次商品的价格的更改两种情况.对于第N+i+3行,如果该行描述一个询问,则接下来为两个整数Li, Ri,表示小H

[模板] 区间mex &amp;&amp; 区间元素种数

区间mex 问题 给定序列\({a_i}\), 每次询问给出\(l\), \(r\), 询问 \(mex \{a_i\}, i \in \{l, l+1, \cdots r\}\) 解法 (在线) 对于每个元素, 用 \(v_i\) 表示它最后一次出现的位置. 考虑到是区间询问, 使用主席树维护 \(v_i\) . 那么答案就是: 第 \(r\) 棵线段树上, 最小的 \(v_i < l\) 的值. 线段树上二分即可. 或者可以离线询问, 对 \(r\) 排序, 然后用线段树维护. 区间元素种数

poj 2689 区间筛素数

由于区间的右端点非常大(INT_MAX),而区间长度相对小(100W),所以考虑区间筛法,左端点为1的情况需要特判一下. 1 #include <cstring> 2 #include <cstdio> 3 #include <cmath> 4 using namespace std; 5 6 typedef long long ll; 7 const int MAX = 9999999; 8 const int MIN = -1; 9 const int N = 50

poj 3264 区间最大最小值 RMQ问题之Sparse_Table算法

Balanced Lineup Time Limit: 5000 MS Memory Limit: 0 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main [Submit] [Status] [Discuss] Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order