Help Hanzo (LightOJ - 1197) 【简单数论】【筛区间质数】

标签: 入门讲座题解 数论


题目描述

Amakusa, the evil spiritual leader has captured the beautiful princess Nakururu. The reason behind this is he had a little problem with Hanzo Hattori, the best ninja and the love of Nakururu. After hearing the news Hanzo got extremely angry. But he is clever and smart, so, he kept himself cool and made a plan to face Amakusa.

Before reaching Amakusa's castle, Hanzo has to pass some territories. The territories are numbered as a, a+1, a+2, a+3 ... b. But not all the territories are safe for Hanzo because there can be other fighters waiting for him. Actually he is not afraid of them, but as he is facing Amakusa, he has to save his stamina as much as possible.

He calculated that the territories which are primes are safe for him. Now given a and b he needs to know how many territories are safe for him. But he is busy with other plans, so he hired you to solve this small problem!

Input

Input starts with an integer T (≤ 200), denoting the number of test cases.

Each case contains a line containing two integers a and b (1 ≤ a ≤ b < 231, b - a ≤ 100000).

Output

For each case, print the case number and the number of safe territories.

Sample Input

3

2 36

3 73

3 11

Sample Output

Case 1: 11

Case 2: 20

Case 3: 4

Note

A number is said to be prime if it is divisible by exactly two different integers. So, first few primes are 2, 3, 5, 7, 11, 13, 17, ...

题意

给定\(l, r\),问区间\([l, \;r]\)内有几个质数?


解析

因为\(n\)较大,且区间长度最大为\(1e5\),所以不能直接使用朴素\(O(\sqrt{n})\)的方法来逐个判断区间的质数。

那么我们可以将埃氏筛的思想运用到区间上。用所有比\(r\)小的质数数来筛掉\([l, \;r]\)区间中的合数。用欧拉筛提前处理出\(\sqrt{N}\)以内的质数。然后用这些质数去筛掉\([l,\;r]\)区间的合数。这样这个算法的时间复杂度就是\(O(len\log \log{len})\)了。

quiz为什么只需要筛出\(\sqrt{N}\)以内的素数?

埃氏筛中,一个质数\(p\)所能筛掉的第一个合数为\(p \times p\)(\(p \times 2, p \times 3, p \times 4, \dots\) 都在之前被其他的质数筛掉了。)如果\(p\)能筛掉的最小合数都比\(N\)大,那么这个\(p\)就是用不到的,就不用筛出这个\(p\)来。


通过代码

/*
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", &times); 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 = max(1ll * prime[i] * prime[i], a / prime[i] * prime[i]); j <= b; j += prime[i]){ //找到落在区间内的,能被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\n", ++ _case, ans);
}
return 0;
}

Help Hanzo (LightOJ - 1197) 【简单数论】【筛区间质数】的更多相关文章

  1. M - Help Hanzo LightOJ - 1197 (大区间求素数)

    题意: 求[a,b]之间的素数的个数 数很大...数组开不起 所以要想到转化 因为小于等于b的合数的最小质因子 一定小于等于sqrt(b),所以只需要求出来[0,sqrt(b)]的素数  然后取倍数删 ...

  2. M - Help Hanzo LightOJ - 1197 (大区间素数筛法)

    题解:素数区间问题.注意到a和b的范围是1<<31,所以直接暴力打表肯定不可以.如果一个数是合数,他的两个因子要么是两个sqrt(x),要么就分布在sqrt(x)两端,所以我们可以根据sq ...

  3. LightOJ 1197 Help Hanzo(区间素数筛选)

    E - Help Hanzo Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit ...

  4. Pairs Forming LCM (LightOJ - 1236)【简单数论】【质因数分解】【算术基本定理】(未完成)

    Pairs Forming LCM (LightOJ - 1236)[简单数论][质因数分解][算术基本定理](未完成) 标签: 入门讲座题解 数论 题目描述 Find the result of t ...

  5. Aladdin and the Flying Carpet (LightOJ - 1341)【简单数论】【算术基本定理】【分解质因数】

    Aladdin and the Flying Carpet (LightOJ - 1341)[简单数论][算术基本定理][分解质因数](未完成) 标签:入门讲座题解 数论 题目描述 It's said ...

  6. Sigma Function (LightOJ - 1336)【简单数论】【算术基本定理】【思维】

    Sigma Function (LightOJ - 1336)[简单数论][算术基本定理][思维] 标签: 入门讲座题解 数论 题目描述 Sigma function is an interestin ...

  7. Goldbach`s Conjecture(LightOJ - 1259)【简单数论】【筛法】

    Goldbach`s Conjecture(LightOJ - 1259)[简单数论][筛法] 标签: 入门讲座题解 数论 题目描述 Goldbach's conjecture is one of t ...

  8. 简单实现图片间的切换动画 主要用到ViewPager

    简单实现图片间的切换动画 主要用到ViewPagerViewPager是android扩展包v4包中的类,这个类可以让用户左右切换当前的view.ViewPager类需要一个PagerAdapter适 ...

  9. (step7.2.1)hdu 1395(2^x mod n = 1——简单数论)

    题目大意:输入一个整数n,输出使2^x mod n = 1成立的最小值K 解题思路:简单数论 1)n可能不能为偶数.因为偶数可不可能模上偶数以后==1. 2)n肯定不可能为1 .因为任何数模上1 == ...

随机推荐

  1. 笔记||Python3之异常处理

    异常概念:1 - 代码执行产生错误,无法继续 2 - 在异常前面代码是可以执行的  ---python是解释型的 3 - 异常作用  --- 程序不要退出 - 可以继续执行 同时给予程序员一定的异常提 ...

  2. linux—chmod

    chmod -options -c 只输出被改变的文件信息      -f , --silent, --quite   当chmod不能改变文件模式时,不通知用户      -R   递归       ...

  3. Python3 常用的几个内置方法

    目录 max()/min() filter() 过滤 map() 映射 sorted筛选 reduce()减少 max()/min() 传入一个参数 (可迭代对象), 返回这个可迭代对象中最大的元素 ...

  4. Docker--DockerFile创建自己的image

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 在我们 ...

  5. 关于页面打印window.print()的样式问题

    当我们打印网页的时候.有时候会发现.打印出来的.跟网页上看到的样式的差别有点大.这其中可能有的问题是.样式问题. 当调用打印(window.print())方法时.打印机会在网页的样式中查找 @med ...

  6. zabbix 安装部署

    环境:CentOS7 机器 两台  分别为server 和 client zabbix下载网址:http://repo.zabbix.com 本次操作使用zabbix4.0 网址:http://rep ...

  7. 人生苦短,我用Python(3)

    1.对列表进行排序: (1)使用列表对象的sort()方法: 列表对象提供了sort()方法用于对原列表中的元素进行排序.排序后原列表中的元素顺序将发生改变.改变对象的sort()方法的语法格式如下: ...

  8. django基础之day09,Forms组件在程序中做了哪些事? 校验数据、渲染标签、展示信息

    ******************************* Forms组件 *************************************************** Forms组件在 ...

  9. Codeforces Global Round 6

    久违的写篇博客吧  A. Competitive Programmer 题目链接:https://codeforces.com/contest/1266/problem/A 题意: 给你一个只包含数字 ...

  10. Java连载62-使用throws关键字处理异常

    ​一.处理异常的两种方式 1.所有的编译时异常,要求程序员在编写程序阶段,必须对它进行处理,如果不处理的话,编译就会无法通过,处理异常有两种方法:捕捉和声明抛出. 2.捕捉:try.....catch ...