标签:Prime YBTOJ ll dif2 lst UVA10140 getchar 质数 lld
Prime Distance
链接:
题目大意:
给定两个正整数 \(l,r\),求 \([l,r]\) 间 相邻 的两个差最大的质数和 相邻 的两个差最小的质数。如果区间内质数个数 \(\le 1\),输出 There are no adjacent primes.
。
思路:
水题,通过前 \(2^16\) 个质数排除 \([l,r]\) 之间的合数。
代码:
const int N = 1e6 + 10;
inline ll Read()
{
ll x = 0, f = 1;
char c = getchar();
while (c != '-' && (c < '0' || c > '9')) c = getchar();
if (c == '-') f = -f, c = getchar();
while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0', c = getchar();
return x * f;
}
int pri[N], tot;
bool vis[N];
void Prework()
{
for (int i = 2; i <= N - 10; i++)
{
if (!vis[i]) pri[++tot] = i;
for (int j = 1; j <= tot && i * pri[j] <= N - 10; j++)
{
vis[i * pri[j]] = 1;
if (i % pri[j] == 0) break;
}
}
}
int main()
{
Prework();
for (ll l, r; ~scanf("%lld%lld", &l, &r); )
{
ll a, b, dif1 = 1ll << 60, c, d, dif2 = 0;
memset (vis, 0, sizeof vis);
if(l == 1) vis[0] = 1;
for (int i = 1; i <= tot; i++)
for (ll j = l / pri[i]; j * pri[i] <= r; j++)
if(j > 1 && j * pri[i] >= l)vis[j * pri[i] - l] = 1;
ll lst = 0;
for (ll i = l; i <= r; i++)
{
if (vis[i - l]) continue;
if (!lst) {lst = i; continue;}
int tmp = i - lst;
if (tmp < dif1) dif1 = tmp, a = lst, b = i;
if (tmp > dif2) dif2 = tmp, c = lst, d = i;
lst = i;
}
if (!lst || !dif2) puts("There are no adjacent primes.");
else printf("%lld,%lld are closest, %lld,%lld are most distant.\n", a, b, c, d);
}
return 0;
}
标签:Prime,YBTOJ,ll,dif2,lst,UVA10140,getchar,质数,lld 来源: https://www.cnblogs.com/GJY-JURUO/p/15125672.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。