1. 程式人生 > >二次篩法找區間兩點特別大(超過10億)的素數-POJ2689

二次篩法找區間兩點特別大(超過10億)的素數-POJ2689

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#define ll long long
using namespace std;
const int maxn=1e6+5;
int prime1[47000],notprime1[maxn],num1=0;
int notprime2[maxn],prime2[maxn],num2;
void init()//構建1到47000(即sqrt(2147483647))之間的素數表   
{
    memset(notprime1,0
,sizeof(notprime1)); for(int i=2; i<=47000; i++) { if(!notprime1[i]) prime1[num1++]=i; for(int j=i*2; j<=47000; j+=i) notprime1[j]=1; } } void getprime(ll l,ll u)//給定區間找素數,模板 { num2=0; memset(notprime2,0,sizeof(notprime2)); if(l<2) l=2
; int k=sqrt(u*1.0); for(int i=0; i<num1&&prime1[i]<=k; i++) { int t=l/prime1[i]; if(t*prime1[i]<l) t++; if(t<=1) t=2; for(int j=t; (ll)j*prime1[i]<=u; j++) notprime2[j*prime1[i]-l]=1; } for(int
i=0; i<=u-l; i++) if(!notprime2[i]) prime2[num2++]=i+l; } int main() { ll l,u; init(); while(~scanf("%I64d %I64d",&l,&u)) { int xmin,ymin,xmax,ymax,maxl=-1,minl=1e9; int len; getprime(l,u); if(num2<2) printf("There are no adjacent primes.\n"); else { for(int i=0; i<num2-1&&prime2[i]<=u; i++) { len=prime2[i+1]-prime2[i]; if(len<minl)//最小距離 { xmin=prime2[i]; ymin=prime2[i+1]; minl=len; } if(len>maxl)//最大距離 { xmax=prime2[i]; ymax=prime2[i+1]; maxl=len; } } printf("%d,%d are closest, %d,%d are most distant.\n",xmin,ymin,xmax,ymax); } } return 0; }

相關推薦

區間兩點特別超過10素數-POJ2689

#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #

bzoj 1901 動態區間第k 樹套樹

#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int Inf

區間第k4種求法

  線性區間求第k大是一個老生常談的問題,我們來總結下4種求解方法(當然遠不止這4種,老話說思想有多遠就能走多遠)。 這裡我們對每種方法的各種屬性進行一個簡單評級(1-5,沒有任何倍數關係) 1:主席樹 (實現難度:2    時間消耗:2    空間消耗:4 )     主

Prime Distance素數

led question nds state rip input bsp round easy Description The branch of mathematics called number theory is about properties of

操作系統筆記頁面置換算 FIFO LRU最近最久未使用法 CLOCK 機會

直接 角度 順序 覆蓋 都是 target mar 有一個 頭結點 前篇在此: 操作系統筆記(五) 虛擬內存,覆蓋和交換技術 操作系統 筆記(三)計算機體系結構,地址空間、連續內存分配(四)非連續內存分配:分段,分頁 內容不多,就不做index了。 功能:當缺頁中斷發生時,

PAT 1078 Hashing[一般][探查]

alt rem http input bre span tput eml ram 1078 Hashing (25 分) The task of this problem is simple: insert a sequence of distinct positiv

luoguP4887 第十四分塊(前體) 莫隊的離線

luoguP4887 第十四分塊(前體) 題目傳送門 分析 掌握核心莫隊科技。 如果說題目中詢問的是某個區間中的兩兩元素,子區間這種沒有辦法在 O

pat 甲級 1078hash探測

題目連結:https://pintia.cn/problem-sets/994805342720868352/problems/994805389634158592 思路: 就是有一個二次探測法的公式:hi = (h(x)+i*i)%m; 二次探索:https://blog.csdn.n

九校聯考DAY1T2(dp,換根與掃描)

題目描述 銀企鵝非常擅長化學。有一天他在試圖命名一個巨大的單烯烴分子的時候,想到了一個問題。 給你一棵樹,一些邊有標記,對於每條有標記的邊,在樹中找到包含這條邊的一條最長鏈,並輸出長度。 輸入格式 第一行一個整數 id 表示測試點的編號。 多組資料

LightOJ-1197-Help Hanzo-數論-

【Description】 Amakusa, the evil spiritual leader has captured the beautiful princess Nakururu. The reason behind this is h

構造雜湊表以及探測

構造雜湊表(散列表)以及二次探測法 今天做筆試題時,遇到一道構造雜湊表的題,hash函式是 k%11 ,然後一個數組記不清了,然後就是問二次探測法進行,問下面那個是正確,懵逼啊,沒做過,不知道,亂選直接下一題,於是有這個部落格,趕緊學習一波。 網上查詢了

構造雜湊表之探測

<pre name="code" class="cpp">//HashTable.h #pragma once #include<iostream> #include <string> using namespace std; enum State { EMPTY,//空

(擴充套件)歐幾里得演算法、素性測試、埃式區間、快速冪運算

來自挑戰程式設計競賽2.6 數學問題的解題竅門 1.歐幾里得演算法 求解最大公約數,時間複雜度在O(log max(a,b))以內,可以看出,輾轉相除法是非常高效的 int gcd(int a,int b) { return (b==0)?a:gcd(b,a%b);

poj2689

我們都知道一次篩法求1-n之間的素數,這個篩法的演算法複雜度為O(N),但題目中的U,L最大值可為整型上限,用純粹的暴力篩法肯定要超時?怎麼辦,用二次篩法。U和L之間的合數,質因子不超過O(L^0.5),於是用篩法選出50000內的素數即可,因為50000的平方大於整形上線

AE開發中幾個功能速成歸納符號設計器、創建要素、圖形編輯、屬性表編輯、緩沖區分析

文件夾路徑 及其 基本框架 option 開啟 rgs database ets remove /* * 實習課上講進階功能所用文檔,因為趕時間從網上抄抄改改,湊合能用,記錄一下以備個人後用。 * * --------------------------------

元碼農的成長之路json到底有什麽用途

頁面 asc 語法 處理 交互 分隔 規則 stl 成長之路 寫的有問題請指出 一、什麽是json 1json指的是javaScript的表示方法 2JSON是輕量級的文本數據交換格式 3 Json是獨立語言 4 json具有自我描述性 更易理解 二、語法規則 1對

元碼農的成長之路I/O復習1

應用 exceptio row har 字節數 對象 i/o rgs clas 一、什麽是流 它代表了有能力產出數據的對象或者有能力接受數據的對象 java類庫的I/O由輸入輸出兩部分組成 二、 inputStream InputStreamReader Read的關系 1

一組資料中只有一個數字出現一,其他所有數字都是成對出現的。請出這個數。使用位運算

連續異或即可得到這個數 #include <windows.h> #include <sdilo.h> int find(int a[],int len) { int ret = 0; int i = 0; for (i = 0; i < len;

程式設計實現: 一組資料中只有一個數字出現了一。其他所有數字都是成對出現的。 請出這個數字。使用位運算

可以在指定陣列中找出只出現一次的元素 #include<stdio.h> int main() { int arr[] = { 1, 3, 4, 3, 1}; int i = 0; int len = sizeof(arr) / sizeof(ar

《資料演算法:Hadoop_Spark資料處理技巧》艾提拉筆記.docx 第1章排序:簡介 19 第2章排序:詳細示例 42 第3章 Top 10 列表 54 第4章左外連線 96 第5

《資料演算法:Hadoop_Spark大資料處理技巧》艾提拉筆記.docx       第1章二次排序:簡介 19 第2章二次排序:詳細示例 42 第3章 Top 10 列表 54 第4章左外連線 96 第5章反轉排序 127 第6章