Help Hanzo (LightOJ - 1197) 简单数论筛区间质数 (未完成)
Posted satchelpp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Help Hanzo (LightOJ - 1197) 简单数论筛区间质数 (未完成)相关的知识,希望对你有一定的参考价值。
Help Hanzo (LightOJ - 1197) 【简单数论】【筛区间质数】 (未完成)
题目描述
题意
解析
通过代码
/*
Problem
LightOJ - 1997
Status
Accepted
Time
105ms
Memory
15856kB
Length
1168
Lang
C++
Submitted
2019-11-25 19:11:37
RemoteRunId
1640684
*/
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e7 + 50;
typedef long long ll;
bool vis[MAXN], _vis[100005];
int prime[MAXN / 10], cnt = 0;
void get_prime() //欧拉线性筛.先筛出sqrt(n)范围内的质数.
{
vis[1] = 1;
for(int i = 2; i <= int(1e6 + 5); i ++){
if(!vis[i])
prime[++ cnt] = i;
for(int j = 1; j <= cnt && i * prime[j] <= int(1e6 + 5); j ++){
vis[i * prime[j]] = 1;
if(i % prime[j] == 0)
break;
}
}
return;
}
int main()
{
int times, _case = 0;
get_prime();
scanf("%d", ×);
while(times --){
ll a, b;
int ans = 0;
memset(_vis, 0, sizeof(_vis));
scanf("%lld%lld", &a, &b);
if(a == 1) _vis[0] = 1; //如果a是1. 1不是质数,但无法通过我们的方法筛掉1.所以先手动筛掉.
for(int i = 1; i <= cnt && 1ll * prime[i] * prime[i] <= b; i ++) //用小于sqrt(b)的素数,开始筛掉[1, b]区间的合数.
for(ll j = a / prime[i] * prime[i]; j <= b; j += prime[i]){
if(j >= a && j > prime[i]) //要让j落在区间中,且j是合数.
_vis[j - a] = 1;
}
for(int j = 0; j < b - a + 1; j ++)
if(!_vis[j])
ans ++;
printf("Case %d: %d
", ++ _case, ans);
}
return 0;
}
以上是关于Help Hanzo (LightOJ - 1197) 简单数论筛区间质数 (未完成)的主要内容,如果未能解决你的问题,请参考以下文章
LightOJ 1197 Help Hanzo(区间素数筛法)
B - Help Hanzo (LightOJ - 1197)
M - Help Hanzo LightOJ - 1197 (大区间求素数)