首页 > 其他分享 >Primes on Interval(欧拉筛+二分+滑动窗口)

Primes on Interval(欧拉筛+二分+滑动窗口)

时间:2023-06-18 10:22:52浏览次数:41  
标签:二分 输出 int Interval mid 复制 Primes

【题面】

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

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

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

【输入格式】

输入一行, 包含三个用空格隔开的整数 ,,a,b,k (1≤,,≤106;≤1≤a,b,k≤106;a≤b)

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

输入输出样例

输入 #1
2 4 2
输出 #1
3
输入 #2
6 13 1
输出 #2
4
输入 #3
1 4 3
输出 #3
-1
//Primes on Interval: https://www.luogu.com.cn/problem/CF237C
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,m,k,res,num,p[N],prime[N];
bool vis[N];
bool check(int u)//滑动窗口判断素数
{
    int hh=n-1,tt=n,cnt=0;//建立队头队尾
    while(hh-tt+1<u){//找到区间的第一个头
        hh++;
        if(!vis[hh]) cnt++;//先++;
    }
    while(hh<=m){
        if(cnt<k) return false;//判断
        hh++; if(!vis[hh]) cnt++;//向前滑动一位,并判断
        tt++; if(!vis[tt-1]) cnt--;//队尾也向前,如果划掉素数了就要减
    }
    return true;
}
int main()
{
    cin>>n>>m>>k;
    vis[1]=true;
    for(int i=2;i<=m;i++){
        if(!vis[i]) prime[++num]=i,p[i]=i;
        for(int j=1;prime[j]<=m/i;j++){
            vis[i*prime[j]]=true;
            if(!(i%prime[j])) break;
        }
    }
    if(!check(m-n+1)) return cout<<-1,0;
    int l=1,r=m+1;
    while(l<r){
        int mid=l+r>>1;
        if(check(mid)) r=mid;
        else l=mid+1;
    }
    cout<<r;
    return 0;
}

 

标签:二分,输出,int,Interval,mid,复制,Primes
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/17488777.html

相关文章

  • Best Cow Fences(前缀和+特殊二分)
    之前的二分大多数都是整数类型的,今天又学到一种新型的二分,浮点数的二分,浮点数的二分可太巧妙了.且听我细细分说::OpenJudge-2018:BestCowFences#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;intn,k;doublea[N],s[N],l,r;boolcheck(doubleu)......
  • 和与积 题解 简单二分查找
    题目大意:给定两个整数\(a(2\lea\le2\times10^9)\)和\(b(1\leb\le10^{18})\)。判断是否存在两个正整数\(x\)和\(y\),同时满足如下两个条件:\(x+y=a\)\(x\timesy=b\)解题思路:用\(a-x\)表示\(y\),可以得到面积的表达式为\(x\times(a-x)\),然后可以发现......
  • 整体二分学习笔记
    概念对于一个很多询问的题,假如对于一个询问可以二分处理,同时一次check可以只用\(n\)的时间处理所有询问的check结果,我们可以使用整体二分来做这个题。思想设函数\(\operatorname{solve}(S,L,R)\)为现在正在处理询问序列\(S\)里的询问,答案值域为\([L,R]\)。向下......
  • 报错:resolution will not be reattempted until the update interval of XXX has elap
     含义:在XXX的更新间隔过去或强制更新之前,不会重新尝试解析。如果你去本地的maven仓库,你会发现,其只有lastUpdate结尾的文件,没有jar包。这个时候,你无论怎么点击IDEA中的ReimportsAllMavenProjects都是没有用的。原因上面也说了,要么等更新时间过去,要么强制更新。maven的默认......
  • 关于vue 使用setInterval定时器关闭失效的问题 原因为事件传播
    /****data.isPlay为显示那个按钮**startHandle开始定时器setInterval**pauseHandle,stopHandle理解为关闭定时器就好了clearInterval**/<viewclass="btn"@click.stop="startHandle"><viewclass="btn-statusbtn-play"><view......
  • 二分答案
    概述二分答案即利用二分查找来得到答案,一般情况下,左边界$left$是$0$或者$1$;右边界$right$则视题目条件而定,取一个很大的数,然后利用二分查找的思想,来找到答案。二分答案的要求如果题目能够使用二分答案的思想来解决,那么$[left,right]$范围内,要满足二段性,即对$[left,......
  • Java基本查找,二分查找,选择排序
    一、基本查找packagecom.itheima.d8_sort_binarysearch;/***基本查找*/importjava.util.Scanner;publicclassTest3{publicstaticvoidmain(String[]args){//1、定义一个数组(基本查找)int[]arr={12,95,1,3,76,4,2,93,56,49,67};......
  • 二分答案
    概述二分答案即利用二分查找来得到答案,一般情况下,左边界$left$是$0$或者$1$;右边界$right$则视题目条件而定,取一个很大的数,然后利用二分查找的思想,来找到答案。二分答案的要求如果题目能够使用二分答案的思想来解决,那么$[left,right]$范围内,要满足二段性,即对$[left,......
  • Looksery Cup 2015-H. Degenerate Matrix(浮点数二分)
    原题链接H.DegenerateMatrixtimelimitpertestmemorylimitpertestinputoutputdeterminant ofamatrix 2 × 2degeneratenorm ||A|| ofamatrix AYouaregivenamatrix .Consideranydegeneratemat......
  • HDU 3277 Marriage Match III(并查集+二分+最大流)
    题意:和HDU3081一样的题意,只不过多了一个条件,每个女孩除了能选自己喜欢的男生之外,还能选不超过K个自己不喜欢的男生,问游戏最多能进行几轮思路:除了选喜欢的,还能选任意K个不喜欢的,怎么建图呢?一开始我想每个女孩连喜欢的男孩,而且选K个不喜欢的男孩也连边,可是这K个要怎么确定呢?这种显然......