当前位置: 首页 > news >正文

[COCI2015-2016#7] Prosti

题目理解

在这里插入图片描述

首先我们理解一下题目,高兴数的定义:所有 ≤ \le 给出M的数和所有质数,要求出一个数,设这个数为i则[i,i+k-1]区间内恰好有L个高兴数,如果不存在的话就输出-1

思路

首先先筛素数,然后求一下素数个数的前缀和,这样就可以方便我们求出一个区间内的素数个数了。
我们设x为某区间内高兴数总和,则一开始我们就可以将x初始化为区间[1,1+k-1]内的高兴数数量,那么就分两种情况讨论
1.K>M那么x=M+(M+1~K的素数数量)
2.K≤M时x=K
此时的x如果<L,则无解,直接输出-1
然后就可以考虑二分来寻找答案,二分的左边界l初始值为1,右边界r初始值为≥1e7即可,mid就为l+r>>1,此时的x就是[mid,mid+k-1]区间的高兴数数量,所以更新x就又要分两种情况:
1.mid>M,则x=[mid,mid+k-1]区间的素数数量
2.mid<M,则x又要分两种情况:

  • 区间的右端点mid+k-1≤M,此时x=K

  • 区间的右端点mid+k-1>M,此时x=M-mid+1+(m+1~mid+k-1的素数个数)
    之后在每次二分时判断x与L的大小关系

  • x=L,直接输出mid,求得答案

  • x>L,答案比mid要大,l=mid+1

  • x<L,答案比mid要小,r=mid-1

代码

#include<bits/stdc++.h>
using namespace std;
const int M=4652354,N=M+200;
bool s[N];
int p[N],prime[N],t;
int get(int len,int l){return p[len+l-1]-p[l-1];
}
void init(){int cnt=0;for (int i=2;i<=N;i++){if (!s[i]){prime[++cnt]=i;	p[i]=1;}		for (int j=1;prime[j]*i<=N&&j<=cnt;j++){s[i*prime[j]]=true;if (i%prime[j]==0) break;	}}
}
int main(){init();for (int i=1;i<N;i++) p[i]=p[i-1]+p[i];cin>>t;while(t--){int k,L,m;cin>>k>>L>>m;int x;if (k>m) x=m+get(k-m,m+1);else x=k; if(x<L){cout<<-1;continue;} int l=1,r=M;while(l<=r){int mid=l+r>>1;//	cout<<l<<" "<<r<<" "<<mid<<" "<<x<<"\n";if (mid<=m){if (mid+k-1>m){x=m-mid+1+get(mid+k-1-m,m+1);}else{x=k;}}else{x=get(k,mid);}if (x==L){cout<<mid<<"\n";break;}else if (x<L){r=mid-1;}else{l=mid+1;}}}return 0;
}

http://www.mrgr.cn/news/57314.html

相关文章:

  • win10下用vscode和pycharm运行odoo18的速度对比
  • java_顺序查找
  • LLaMA Factory环境配置
  • LeetCode题练习与总结:重新安排行程--332
  • 【厦门大学附属第一医院(互联网医院)-注册安全分析报告-无验证方式导致安全隐患】
  • 【WSL2】Ubuntu20.04从零开搭PX4MavrosGazebo环境并测试
  • 正则中的字符集
  • LeetCode 110. 平衡二叉树
  • 滑动窗口与TCP的缓冲区(buff)的关系
  • 四向车西门子PLC1200脉冲控制伺服与总线型控制方式思考
  • 【排序】快排思想以及例子
  • JavaScript 第30章:综合项目
  • “摄像机”跟随及攻击抖动实现
  • Linux基础IO
  • Android Handler(Looper.getMainLooper()),Kotlin
  • priority_queue (优先级队列的使用和模拟实现)
  • K折交叉验证代码实现——详细注释版
  • IPC 信号-Signal Linux环境
  • 栈的顺序存储总览
  • 关于风险系统解读最全最专业文章:一篇文章讲透风险,跨学科搞懂风险游戏规则,风险信任风险主观性客观性风险本质人格特质与风险态度技术风险系统风险社会新产品风险
  • 栈和队列代码
  • ARM/Linux嵌入式面经(五二):华为
  • Spring 设计模式之单例模式
  • C++新基础类型(C++11~C++20)
  • ECharts图表图例11
  • 解决cad找不到vcruntime140_1.dll,无法继续执行代码的6种方法