• 洛谷题解 | AT_abc321_c Primes on Interval


    题目翻译

    【题目描述】
    你决定用素数定理来做一个调查. 众所周知, 素数又被称为质数,其含义就是除了数字一和本身之外不能被其他任何的数字除尽.

    现在给定一个正整数序列 a , a + 1 , ⋯   , b a,a+1,\cdots,b a,a+1,,b ( a ≤ b ) (a \le b) (ab), 请找出一个最小值 l l l, 使其满足对于任意一个长度为 l l l 的子串, 都包含 k k k 个质数.

    找到并输出符合要求的最小值 l l l, 如果不存在符合要求的长度 l l l, 则输出 − 1 -1 1.

    【输入格式】

    输入一行, 包含三个用空格隔开的整数 a , b , k a,b,k a,b,k ( 1 ≤ a , b , k ≤ 1 0 6 ; a ≤ b 1 \le a,b,k \le 10^{6}; a \le b 1a,b,k106;ab)

    【输出格式】
    输出一行, 为符合要求的最小值 l l l, 若不存在, 输出 − 1 -1 1.

    题目描述

    You’ve decided to carry out a survey in the theory of prime numbers. Let us remind you that a prime number is a positive integer that has exactly two distinct positive integer divisors.

    Consider positive integers a a a , a + 1 a+1 a+1 , . . . ... ... , b b b ( a < = b ) (a<=b) (a<=b) . You want to find the minimum integer l l l ( 1 < = l < = b − a + 1 ) (1<=l<=b-a+1) (1<=l<=ba+1) such that for any integer x x x ( a < = x < = b − l + 1 ) (a<=x<=b-l+1) (a<=x<=bl+1) among l l l integers x x x , x + 1 x+1 x+1 , . . . ... ... , x + l − 1 x+l-1 x+l1 there are at least k k k prime numbers.

    Find and print the required minimum l l l . If no value l l l meets the described limitations, print -1.

    输入格式

    A single line contains three space-separated integers a , b , k a,b,k a,b,k ( 1 < = a , b , k < = 1 0 6 ; a < = b 1<=a,b,k<=10^{6}; a<=b 1<=a,b,k<=106;a<=b ).

    输出格式

    In a single line print a single integer — the required minimum l l l . If there’s no solution, print -1.

    样例 #1

    样例输入 #1

    2 4 2
    
    • 1

    样例输出 #1

    3
    
    • 1

    样例 #2

    样例输入 #2

    6 13 1
    
    • 1

    样例输出 #2

    4
    
    • 1

    样例 #3

    样例输入 #3

    1 4 3
    
    • 1

    样例输出 #3

    -1
    
    • 1

    题目简化

    求一个区间内,任意长度为 l l l 的子串中都包含 k k k 个质数的最小 l l l

    题目思路

    初始化一个数组存储从 2 2 2 开始的所有素数。初始化后,这个数组中所有值都是 true,表示对应的数是素数。

    使用埃拉托斯特尼筛法(Sieve of Eratosthenes)来找出所有小于 M A X MAX MAX 的素数。这个算法的主要思想是,如果一个数不是素数,那么它必定有一个因子小于或等于其平方根。因此,我们只需要检查到每个数的平方根即可。

    在主循环中,读取三个输入: a a a, b b b k k k。然后,创建一个队列 q q q 并把 a − 1 a-1 a1 放入队列。

    接下来,进行一系列操作来找出在区间 [ a , b ] \text [a, b] [a,b] 中,长度为 k k k 的所有素数子序列。如果存在这样的子序列,那么就更新 r e s res res 的值。

    如果 q q q 的头部元素是 a − 1 a-1 a1,那么就输出 -1 \texttt -\texttt 1 -1,否则输出 r e s res res

    AC代码

    #include 
    using namespace std;
    #define li        long long int
    #define rep(i,to) for(li i=0;i<((li)(to));++i)
    #define pb        push_back
    #define sz(v)     ((li)(v).size())
    #define bit(n)    (1ll<<(li)(n))
    #define all(vec)  (vec).begin(),(vec).end()
    #define each(i,c) for(__typeof((c).begin()) i=(c).begin();i!=(c).end();i++)
    #define MP        make_pair
    #define F         first
    #define S         second
    
    
    #define MAX 1000500
    li is_prime[MAX];
    
    int main()
    {
        rep(i, MAX)if(2 <= i) is_prime[i] = true;
        for(li i = 2; i * i < MAX; i++){
            if(!is_prime[i]) continue;
            for(li j = i * i; j < MAX; j += i) is_prime[j] = false;
        }
        li a, b, k;
        cin >> a >> b >> k;
        queue<li> q;
        li res = -1;
        q.push(a - 1);
        for(li pos = a; pos <= b; pos++){
            if(is_prime[pos]) q.push(pos);
            while(k < sz(q)) q.pop();
            if(sz(q) == k) res = max(res, pos - q.front() + 1);
        }
        if(q.front() == a - 1) cout << -1 << endl;
        else cout << res << endl;
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,如果喜欢我的文章,给个关注吧!

    冰焰狼 | 文

    如果本篇博客有任何错误,请批评指教,不胜感激 !

  • 相关阅读:
    朋友圈为什么会被折叠?
    终端登录github两种方式
    好好学习第四天:生成对抗网络(GAN)手写数字生成
    【HMS core】【Analytics Kit】华为分析服务常见问题FAQ 2
    JRS303-数据校验
    关于pycharm打开时一直加载中的解决办法
    Docker注入环境变量且设置多个环境变量
    利用shp文件构建mask【MATLAB和ARCGIS】两种方法
    如厕神器,阿里大神手打的Spring全家桶脑图(spring+MVC+Boot+Cloud)
    企业数据泄密的场景有哪些?怎样斩断员工泄密风险?
  • 原文地址:https://blog.csdn.net/weixin_57347115/article/details/133432073