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的全部內容,希望文章能夠幫你解決所遇到的問題。