首页 > 其他分享 >洛谷 P5723 【深基4.例13】质数口袋 题解

洛谷 P5723 【深基4.例13】质数口袋 题解

时间:2024-07-03 14:28:43浏览次数:21  
标签:13 false 题解 质数 pri long return now

题面传送门

观察题目,我们可以看到这是一道朴素的,判断质数的一道题目。

何为质数?质数就是除了 1 1 1 和这个本身,没有其他因数的数。特别的, 1 1 1 和 0 0 0 既不是质数也不是合数

很容易就可以得到以下判断质数的代码。

bool is_pri(long long x){
	if(x==0||x==1){
		return false;//特判
	}
	for(long long i=2;i<=x-1;i++){
		if(x%i==0){
			return false;
		}
	}
	return true;
}

但是,这样会有 O ( n ) O(n) O(n) 的时间复杂度,对于更高的数据限制,很明显是吃不消的。经过思考可得,我们还可以只判断到 n 2 \dfrac{n}{2} 2n​ 即可。于是便有了以下代码。

bool is_pri(long long x){
	if(x==0||x==1){
		return false;//特判
	}
	for(long long i=2;i<=x/2;i++){
		if(x%i==0){
			return false;
		}
	}
	return true;

这样还是很慢。怎么办呢?我们还有一种 O ( n ) O(\sqrt n) O(n ​) 的方法,只需遍历到 ⌈ n ⌉ \left\lceil\sqrt n\right\rceil ⌈n ​⌉。解释:如果一个数不是质数就是合数( 1 1 1 和 0 0 0 除外),那么一定可以由两个自然数相乘得到,其中一个大于或等于它的平方根,一个小于或等于它的平方根,并且成对出现。

综上所述,就可以得到以下代码。

bool is_pri(long long x){
	if(x==0||x==1){
		return false;
	}
	for(long long i=2;i*i<=x;i++){//换了一种方式
		if(x%i==0){
			return false;
		}
	}
	return true;
}

接下来再来实现主函数代码。由题意分析可得,这道题应采用循环结构,用 while 循环来实现。如果重量超过了袋子的负载量,就结束。

以下是 while 循环的代码。

	while(1){
		if(is_pri(j)){
			if(now+j>l){//now 是用来存储当前袋子的重量的
				break;
			}
			cout<<j<<endl;
			ans++;
			now+=j;
		}
		j++;
	}

以下来看详细代码(时间复杂度粗略估计为 O ( l l ln ⁡ l ) O(l \sqrt{\frac{l}{\ln l}}) O(llnll​ ​))。

#include<bits/stdc++.h>
using namespace std;
long long l,now=0,ans=0,j=2;
bool is_pri(long long x){
	if(x==0||x==1){
		return false;
	}
	for(long long i=2;i*i<=x;i++){
		if(x%i==0){
			return false;
		}
	}
	return true;
}
int main(){
	cin>>l;
	while(1){
		if(is_pri(j)){
			if(now+j>l){
				break;
			}
			cout<<j<<endl;
			ans++;
			now+=j;
		}
		j++;
	}
	cout<<ans<<endl;
	return 0;
}

标签:13,false,题解,质数,pri,long,return,now
From: https://blog.csdn.net/sugars_1216/article/details/140150408

相关文章

  • 0137_Single-Number-II【M】
    JY:找出列表中只出现1次的数值(其它数值均出现3次)参考:https://www.yuque.com/it-coach/leetcode/xkogct1、利用数值二进制位的特性(执行效率并不高)题目中明确了数字的范围是32位整型(-2^31<=nums[i]<=2^31-1),所以从低位遍历到高位,将所有数字的二进制对应位相加,由......
  • python+中医病案管理系统设计与实现-计算机毕业设计源码131320
    摘 要随着互联网时代的到来,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个B/S结构的中医病案管理系统,会使;中医病案管理系统的管理工作系统化、规范化,也会提高平台形象,提高管理效率。本系统是针对目前中医病案管理系统的实际需求,从实际工作出发,对过......
  • AT_arc180_a [ARC180A] ABA and BAB 题解
    思路首先一个浅显易得的结论,当\(A\)或\(B\)连续出现时,我们可以将它们分成两段,每段都可以看作一个独立事件,结果数只和每个独立事件的样本点有关。我们设独立事件共有\(tot\)个,每个独立事件的样本点为\(w_i\),则显然有\(ans=\prod_{i=1}^{tot}w_i\)。接下来该找\(w_i\)......
  • 题解 - 数字计数
    题目思路简析正解是数位dp,但是我不太会,所以我打分块。考虑从\(10^6\)到\(2\times10^6\)和从\(3\times10^6\)到\(4\times10^6\),其中真正的区别只有观察到数据范围是\(10^{12}\),分为一些块,每块长\(10^6\)会比较均衡,所以共有\(10^6\)个块。最差情况是\(n=10^6+1......
  • 1367java jsp SSM留学生交流互动论坛网站系统经验分享计划分享软件推荐网址推荐标签分
     项目技术:SSM+Maven+Vue等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/1......
  • 题解 - 数字计数
    题目思路简析正解是数位dp,但是我不太会,所以我打分块。考虑从\(10^6\)到\(2\times10^6\)和从\(3\times10^6\)到\(4\times10^6\),其中真正的区别只有观察到数据范围是\(10^{12}\),分为一些块,每块长\(10^6\)会比较均衡,所以共有\(10^6\)个块。最差情况是\(n=10^6+1......
  • 07/02/2024 融合热身赛赛后总结&题解
    一、总体情况考试一共有五道题。这次考试失误严重,C题非常水的一道题做了快两个小时,严重影响了心态和做其它题的时间。最终3个小时只做了A,C......
  • [JLU] 数据结构与算法上机题解思路分享-第三次上机
    前言首先,请务必自己尽全力尝试实现题目,直接看成品代码,思维就被拘束了,也很容易被查重。这里只是思路解析的博客,代码仓库在JLU_Data_Structures_Record希望你能在这里找到你想要的:)正文A图的创建分数10作者朱允刚单位吉林大学请编写程序创建一个有向图。有向图中包含......
  • 【力扣 - 每日一题】3115. 质数的最大距离(一次遍历、头尾遍历、空间换时间、埃式筛、
    原题链接题目描述给你一个整数数组nums。返回两个(不一定不同的)质数在nums中下标的最大距离。示例1:输入:nums=[4,2,9,5,3]输出:3解释:nums[1]、nums[3]和nums[4]是质数。因此答案是|4-1|=3。示例2:输入:nums=[4,8,2,8]输出:0解释:nums[2]是质......
  • P4097 【模板】李超线段树 / [HEOI2013] Segment
    P4097【模板】李超线段树/[HEOI2013]Segment前言李超线段树并不是一种新的线段树,而是对一类题维护最值的过程做了改进,使线段树仍然有不错的复杂度。引入简要题意实现两种操作:在区间\([x_0,y_0]\)上加入一条两端为\((x_0,y_0)\),\((x_1,y_1)\)的线段。查询下标\(k......