【数论 二分查找】P7588 双重素数(2021 CoE-II A)|普及

本文涉及的基础知识点

C++二分查找
数论:质数、最大公约数、菲蜀定理

双重素数(2021 CoE-II A)

题目描述

素数(质数)是指在大于 1 1 1 的自然数中,除了 1 1 1 和它本身以外不再有其他因数的自然数。定义双重素数为这样的素数:它的各位数字之和也是一个素数。给定一个闭区间,试确定在该区间内双重素数的个数。

输入格式

输入包含多组测试数据。

输入第一行包含一个整数 T T T,表示测试数据的组数。接下来每行一组测试数据,每组测试数据包含以空格分隔的两个整数 L L L R R R

输出格式

每组测试数据输出一行,包含一个整数,表示在闭区间 [ L ,   R ] [L,\ R] [L, R] 内双重素数的个数。

样例 #1

样例输入 #1

4
3 3
4 4
1 5
1 15

样例输出 #1

1
0
3
5

提示

样例说明

1 1 1 15 15 15 共有 6 6 6 个素数: 2 2 2 3 3 3 5 5 5 7 7 7 11 11 11 13 13 13。前五个素数各自的数字之和也是素数,因此都是双重素数。素数 13 13 13 的各位数字之和为 4 4 4,不是素数,故 13 13 13 不是双重素数。


数据范围

  • Subtask 1 1 1 1 ≤ L ≤ R ≤ 1 0 2 1 \le L \le R \le 10^2 1LR102 10 10 10 分。
  • Subtask 2 2 2 1 ≤ L ≤ R ≤ 1 0 4 1 \le L \le R \le 10^4 1LR104 20 20 20 分。
  • Subtask 3 3 3 1 ≤ L ≤ R ≤ 1 0 6 1 \le L \le R \le 10^6 1LR106 60 60 60 分。
  • Subtask 4 4 4 1 ≤ L ≤ R ≤ 1 0 8 1 \le L \le R \le 10^8 1LR108 10 10 10 分。

对于 100 % 100\% 100% 的数据, 1 ≤ T ≤ 100 1 \le T \le 100 1T100


提示(数据已经加强)

最后一个子任务要求你的程序必须具有较高的空间使用效率和时间效率,否则容易超出内存限制或时间限制。

欧拉筛(线性筛)+二分查找

m = max( R),时间复杂度:O(m)+O(TlogR) 最后一个子任务在超时的边缘。
内存也是O(n),不低于400M,铁定超。
v[i]记录i是否是素数,i ∈ \in [0,100]
利用线性筛,筛出108内的素数。
对素数求和sum,如果v[sum]成立,放到v2中。
upper(v2,R)-lower(v2,L)
先试试,不行再优化。
理论上过不了,实际过了

你可能感兴趣的:(#,洛谷普及,算法,c++,洛谷,数学,二分查找,数论,位和)