Prime Distance
L,R的范围很大,任何已知算法都无法在规定时间内生成[1,R]中的所有质数
但R-L的值很小,并且任何一个合数n必定包含一个不超过sqrt(n)的质因子
解:用筛法求出2~sqrt®之间的所有质数.对于每个质数p,将范围内其倍数标记,未被标记的即为合数
(这里的标记也可以用下题中,选倍数的方法,可以进一步优化时间复杂度)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int l, u;
int v[1 << 16];
bool jud[1000005];
while (cin >> l >> u)
{
if (l == 1)
l++;
memset(jud, 0, sizeof(jud));
vector<int> su;
su.clear();
memset(v, 0, sizeof(v));
for (int i = 2; i <= sqrt(u); i++)
{
if (v[i])
continue;
// 素数运算,i为素数
for (int j = ceil(l / i); j <= floor(u / i); j++)
{
if (j == 1)
continue;
jud[i * j - l] = 1;
}
for (int j = i; j <= sqrt(u) / i; j++)
v[i * j] = i;
}
int maxx = 0, leftt, r;
for (int i = 0; i <= u-l; i++)
{
if (!jud[i])
{
su.push_back(i+l);
}
}
if (su.size() < 2)
cout << "There are no adjacent primes.\n";
else
{
int ans_l, ans_r, ansl2, ansr2, l2, r2, minn;
ansl2 = ans_l = leftt = l2 = su[0], ansr2 = ans_r = r = r2 = su[1];
maxx = minn = r - leftt;
for (int i = 2; i < su.size(); i++)
{
leftt = r;
r = su[i];
if (maxx < r - leftt)
{
maxx = r - leftt;
ans_l = leftt;
ans_r = r;
}
if (minn > r - leftt)
{
minn = r - leftt;
ansl2 = leftt;
ansr2 = r;
}
}
printf("%d,%d are closest, %d,%d are most distant\n", ansl2, ansr2, ans_l, ans_r);
}
}
return 0;
}
注意点:map不能轻用,其添加,存取,删除的时间复杂度为log(n),不是O(1)