日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

uva 10140——Prime Distance

發布時間:2023/11/30 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 uva 10140——Prime Distance 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:題目出的很簡單,給定一個數據范圍(好吧,又是給定一個范圍),然后問你在這個給定的范圍內,哪兩個相鄰素數挨的最近,哪兩個最遠。

思路:這破題數據量很大,如果直接打表,鐵定T,我蛋疼地打過兩邊了,T了好幾次,后來看到隊友P用拉賓米勒的算法水過去了,不過到了poj哪里還是T個不停,算是擦邊球,后來又wa了好幾次,實在不行,也套用了米勒拉賓的模板,本以為順風水過,誰知又T了,這題擱置了幾天,中間看了題解,正解是打一個較小的素數表,然后用這個素數表去篩大的素數,注意要把下標改小,不然存不下,兩次曬素數,方法和原理都一樣,當時就是沒想到!

code:

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

typedef long long ll;
const ll N=1000010;
const ll INF=0x3f3f3f3f3f;
ll p[N],len,vis[N];

void tab() //第一個素數表
{
len=0;
for (ll i=2;i<N;i++)
{
if (vis[i]) continue;
p[len++]=i;
for (ll j=i;j<N;j+=i)
vis[j]=1;
}
}
void sol(ll m,ll n) //根據第一個素數表去篩第二個素數表
{
memset(vis, 0, sizeof(vis));
for (ll i = 0; i <len; i++) {
for (ll j = (m/ p[i] + (m % p[i] != 0)) * p[i]; j <= n; j += p[i]) {
if (j / p[i] != 1)
vis[j - m] = 1;
}
}
}
int main()
{
tab();
ll m,n;
while (~scanf("%lld %lld",&m,&n))
{
sol(m,n);
ll mn=INF,mx=0,f=-1,fl=1;
ll minl,minr,maxl,maxr;
for (ll i=m;i<=n;i++)
{
if (vis[i-m]||i==1) continue;
if (f!=-1)
{
if (i-f<mn)
{
mn=i-f;
minl=f; minr=i;
}
if (i-f>mx)
{
mx=i-f;
maxl=f;maxr=i;
}
fl=0;
}
f=i;
}
if (fl) printf("There are no adjacent primes.\n");
else
printf("%lld,%lld are closest, %lld,%lld are most distant.\n",minl,minr,maxl,maxr);
}
}
//1 2147483647

總結

以上是生活随笔為你收集整理的uva 10140——Prime Distance的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。