第十四届蓝桥杯 2023 C/C++组 平方差

news2025/4/22 6:43:09

目录

题目:

题目描述:

题目链接:

思路:

核心思路:

第一种思路:

第二种思路:

坑点:

代码:

数学+找规律 O(n) 50分代码详解:

O(1)满分代码详解:

打表+找规律 O(1)代码详解:

补充平方差结论题目:

补充题目链接:

补充平方差结论代码详解:

河狸的数代码:

你不干?有的是帕鲁干!代码:


题目:

题目描述:

题目链接:

洛谷 P9231 [蓝桥杯 2023 省 A] 平方差

蓝桥云课 平方差

思路:

核心思路:

数学+找规律或打表+找规律

第一种思路:

第一种思路是用数论知识,用数学的方式推导出结论。如果之前有平方差的前置数学知识的话,这题很快就能解决,如果没有的话靠自己用数学知识也能推导出来,但是能不能想得到就是另一回事了

平方差结论:若a,b都是整数,则a^2-b^2一定是奇数或者4的倍数

a^2-b^2=(a+b)*(a-b),若a,b两个都是奇数,则a+b,a-b都是偶数,则(a+b)*(a-b)是4的倍数,因为偶数都有公共的质因子2,所以偶数*偶数一定是4的倍数; 若a,b一奇一偶,则a+b,a-b都是奇数,则(a+b)*(a-b)是奇数,因为奇数*奇数一定是奇数

再大白话地说:由题x=y^2-z^2,由平方差公式x=(y+z)*(y-z),y+z和y-z的奇偶性相同,5+3=8,5-3=2或5+4=9,5-4=1。所以x满足可以拆成两个奇偶性相同的数的乘积,如果x是奇数,可以拆成1乘以它本身。如果x是偶数,可以拆成两个偶数,所以应是4的倍数,拆成2和x/2。综上,答案是[l,r]区间的奇数和4的倍数的数的个数

第二种思路:

第二种思路是打表+找规律,这也是蓝桥杯常考的找规律的题的一种做法(后续我会总结蓝桥杯常见的找规律的题)。这里先简单提一嘴:找规律的题的特点:数据非常大,通常大于1e8,看上去非常吓人,肯定暴力跑不出来。但是一般有两个特性:1.周期性(结果在固定后重复)2.答案符合某种递推式。打表的意思就是先尝试暴力得到符合题目要求的前100、1000项来找规律。

坑点:

这题还有一个很阴的地方,即使你找到正确规律正常写也很容易踩坑。由题发现R最大为1e9,并且这题是编程题,也就是说正常一个for循环也会超时,只能拿50分。所以发现规律之后还得优化时间复杂度,把时间复杂度从O(n)优化到O(1)才能拿满分

代码:

数学+找规律 O(n) 50分代码详解:

#include<bits/stdc++.h> //这题主要考察数学+找规律,同时还有时间复杂度的问题 
using namespace std;    //这是我了解思路之后的第一个程序,时间复杂度O(n),只能拿50分,剩下50分超时 
                        //这题只有把时间复杂度优化到O(1)才能拿满分
int l,r;
int cnt;

int main()
{
	scanf("%d %d",&l,&r);
	for(int i=l;i<=r;i++) //遍历l到r的每一个整数,使用for循环,时间复杂度O(n) 
	{
		if(i%2==1) //判断是奇数 
		{
			cnt++;
		}
		if(i%4==0) //判断是4的倍数 
		{
			cnt++;
		}
	}
	cout<<cnt<<endl;
	return 0;
}
//数学+找规律思路:
//由题x=y^2-z^2,由平方差公式x=(y+z)*(y-z),y+z和y-z的奇偶性相同,5+3=8,5-3=2或5+4=9,5-4=1 
//所以x满足可以拆成两个奇偶性相同的数的乘积
//如果x是奇数,可以拆成1乘以它本身
//如果x是偶数,可以拆成两个偶数,所以应是4的倍数,拆成2和x/2
//综上,答案是[l,r]区间的奇数和4的倍数的数的个数 

O(1)满分代码详解:

#include<bits/stdc++.h> //时间复杂度O(1),不会超时能拿全部分 
using namespace std;

int l,r;

int f_jishu(int x) //求从[0,x]区间奇数的个数 
{
	return (x+1)/2; //传入0->0 ,1->1 ,2->1 ,3->2 ,4->2 ~~101->51 
}

int f_4(int x) //求[0,x]区间是4倍数的数的个数 
{
	return x/4; //显然传入3->0 ,4->1 ,7->1 ,8->2 ~~101->25 
}

int main()
{
	scanf("%d %d",&l,&r);
	cout<<f_jishu(r)+f_4(r)-f_jishu(l-1)-f_4(l-1); //求[l,r]区间奇数和是4倍数的数的个数 
	return 0;
}

打表+找规律 O(1)代码详解:

#include<bits/stdc++.h>  //蓝桥杯常考的找规律的题,由题R最大为10^9,数据范围太大,暴力肯定不行 
using namespace std;  //平方差结论:若a,b都是整数,则a^2-b^2一定是奇数或者4的倍数
//a^2-b^2=(a+b)*(a-b),若a,b两个都是奇数,则a+b,a-b都是偶数,则(a+b)*(a-b)是4的倍数,因为偶数都有公共
//的质因子2,所以偶数*偶数一定是4的倍数; 若a,b一奇一偶,则a+b,a-b都是奇数,则(a+b)*(a-b)是奇数,因为
//奇数*奇数一定是奇数
//如果知道这个前置结论:题目就转换为L到R之间是奇数或者是4的倍数的数总和 

int l,r;           //这题还有一个比较阴的地方就是,知道规律之后,用一次for还是会超时 
                   //时间复杂度O(n),但是R最大为10^9,O(n)的话最大为10^9 >10^8,必须优化到O(1) 
int f_jishu(int x)
{
	return (x+1)/2;
}

int f_4(int x)
{
	return x/4;
}

int main()
{
	scanf("%d %d",&l,&r);
	cout<<f_jishu(r)+f_4(r)-f_jishu(l-1)-f_4(l-1);
	return 0;
}

//如果不知道这个前置结论,做的时候也没推出结论,那别无他法的时候还是先暴力枚举100个看看有没有规律 
//int main()
//{
//	for(int i=1;i<=100;i++)  //暴力从1枚举到100找找看规律 
//	{
//		for(int j=0;j<=100;j++)  //i=k^2-j^2,由于搞不清到什么程度找不到j和k才算不满足要求 
//		{
//			for(int k=j+1;k<=100;k++) //所以先把i和k的终止条件先设大一点试试看 
//			{
//				if(i==k*k-j*j)
//				{
//					cout<<i<<' ';
//				}
//			}
//		}
//	}
//	return 0;
//}
//1 3 4 5 7 8 9 9 11 12 13 15 15 16 16 17 19 20 21 21 23 24 24 25 25 27 27 28 29 31 32 32 33 33 
//35 35 36 36 37 39 39 40 40 41 43 44 45 45 45 47 48 48 48 49 49 51 51 52 53 55 55 56 56 57 57 
//59 60 60 61 63 63 63 64 64 64 65 65 67 68 69 69 71 72 72 72 73 75 75 75 76 77 77 79 80 80 80 
//81 81 81 83 84 84 85 85 87 87 88 88 89 91 91 92 93 93 95 95 96 96 96 96 97 99 99 99 100 100
//输出数据发现有的数会重复输出几次,是因为j,k设置的终止条件满足能找到多种组合来平方差得到i
//但是毕竟是没有其他思路办法的无奈之举,所以把重复的数删一下再找找有没有规律 
//1 3 4 5 7 8 9 11 12 13 15 16 17 19 20 21 23 24 25 27 28 29 31 32 33 35 36 37 39 40 41 43 44 45 
//47 48 49 51 52 53 55 56 57 59 60 61 63 64 65 67 68 69 71 72 73 75 76 77 79 80 81 83 84 85 87 88
//89 91 92 93 95 96 97 99 100
//这些就是删去重复的满足题目要求的解了,通过这些数勉强能看出奇数和4的倍数能满足要求,但是有点抽象

补充平方差结论题目:

补充题目链接:

蓝桥云课 河狸的数(平方差结论)

蓝桥云课 你不干?有的是帕鲁干!(平方差结论拓展)

补充平方差结论代码详解:

河狸的数代码:

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+10;  //多开一点,防止数组越界 

int n;
long long a[N];      //由题整数最大为10^18,会爆int,一定要开long long 

int main()
{
  cin>>n;
  for(int i=0;i<n;i++)
  {
    scanf("%lld",&a[i]);
    if(a[i]%4==0||a[i]%2==1)  //平方差结论 
    {
      printf("Yes ");
    }
    else
    {
      printf("No ");
    }
  }
  return 0;
}

你不干?有的是帕鲁干!代码:

#include<bits/stdc++.h> //这题是平方差结论的拓展,由题要求x可以被表达成两个连续正奇数的平方之差 
using namespace std;    //两个连续正奇数:2*k-1 2*k+1(从1开始,所以k=1,2,3...)
//由平方差公式:(2*k+1)^2-(2*k-1)^2=(2*k+1+2*k-1)*(2*k+1-2*k+1)=8*k  k=1,2,3...
//所以如果x能被表达为两个连续正奇数的平方之差,则x是8的倍数,注意由题x从0开始,但是x不能为0,因为k从
//1开始,即最小满足能被表达成两个连续正奇数的平方之差的数是8,所以判断条件是x!=0&&x%8==0,输出Yes
//题目还要求从小到大输出这两个连续正奇数,即先求k=x/8,a=2*k-1,b=2*k+1,输出a b即可 

long long x;  //由题输入的非负整数x最大为10^18,会爆int,要开long long 
int n;

int main()
{
	cin>>n;
	while(n--)
	{
		scanf("%lld",&x);
		if(x!=0&&x%8==0)   //由结论判断x是否能被表达成两个连续正奇数的平方之差 
		{
			printf("Yes\n");
			long long k=x/8;   //注意x最大为10^18,x要开long long,那么k,a,b都要开long long 
			long long a=2*k-1; //因为k,a,b都是很小的运算,如果x爆int,则k,a,b后续运算也会爆int 
			long long b=2*k+1;
			printf("%lld %lld\n",a,b);
		}
		else
		{
			printf("No\n");
		}
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2339916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

I/O复用函数的使用——select

I/O复用函数的使用——select 目录 一、概念 二、select接口 2.1 基础概念 2.2 使用 select 函数的标准输入读取代码 2.3 基于 select 模型的多客户端 TCP 服务器实现 一、概念 i/o复用使得程序能同时监听多个文件描述符&#xff0c;可以提高程序性能。 之前为了让服务器能…

图像预处理-图像轮廓特征查找

其实就是外接轮廓&#xff0c;有了轮廓点就可以找到最上、最下、最左、最右的四个坐标&#xff08;因为有xmin,xmax,ymin,ymax&#xff09;。就可以绘制出矩形。 一.外接矩形 cv.boundingRect(轮廓点) - 返回x,y,w,h&#xff0c;传入一个轮廓的轮廓点&#xff0c;若有多个轮廓需…

全同态加密医疗数据分析集python实现

目录 摘要一、前言二、全同态加密与医疗数据分析概述2.1 全同态加密(FHE)简介2.2 医疗数据分析需求三、数据生成与预处理四、系统架构与流程4.1 系统架构图五、核心数学公式六、异步任务调度与(可选)GPU 加速七、PyQt6 GUI 设计八、完整代码实现九、自查测试与总结十、展望…

list的学习

list的介绍 list文档的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一…

HarmonyOS:Navigation实现导航之页面设置和路由操作

导读 设置标题栏模式设置菜单栏设置工具栏路由操作页面跳转页面返回页面替换页面删除移动页面参数获取路由拦截 子页面页面显示类型页面生命周期页面监听和查询 页面转场关闭转场自定义转场共享元素转场 跨包动态路由系统路由表自定义路由表 示例代码 Navigation组件适用于模块…

管道位移自动化监测方案

一、背景 管道系统在区域性地质沉降作用下易形成非均匀应力场集中现象&#xff0c;诱发管体屈曲变形及环焊缝界面剥离等连续损伤累积效应&#xff0c;进而导致管道力学性能退化与临界承载能力衰减。传统人工巡检受限于空间覆盖度不足及数据采集周期长&#xff08;≥72h&#xf…

【学习笔记】机器学习(Machine Learning) | 第五周| 分类与逻辑回归

机器学习&#xff08;Machine Learning&#xff09; 简要声明 基于吴恩达教授(Andrew Ng)课程视频 BiliBili课程资源 文章目录 机器学习&#xff08;Machine Learning&#xff09;简要声明 一、逻辑回归的基本原理分类判断条件模型输出的解释Sigmoid 函数与 Logistic 函数逻辑…

Python 深度学习 第8章 计算机视觉中的深度学习 - 卷积神经网络使用实例

Python 深度学习 第8章 计算机视觉中的深度学习 - 卷积神经网络使用实例 内容概要 第8章深入探讨了计算机视觉中的深度学习&#xff0c;特别是卷积神经网络&#xff08;convnets&#xff09;的应用。本章详细介绍了卷积层和池化层的工作原理、数据增强技术、预训练模型的特征…

[免费]SpringBoot+Vue博物馆(预约)管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue博物馆(预约)管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue博物馆(预约)管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着计算机科学技术的日渐成熟&#xff…

【python】pyCharm常用快捷键使用-(2)

pyCharm常用快捷键使用 快速导入任意类 【CTRLALTSPACE】代码补全【CTRLSHIFTENTER】代码快速修正【ALTENTER】代码调试快捷键

机器视觉lcd屏增光片贴合应用

在现代显示制造领域&#xff0c;LCD屏增光片贴合工艺堪称显示效果的"画龙点睛"之笔。作为提升屏幕亮度、均匀度和色彩表现的关键光学组件&#xff0c;增光片的贴合精度直接影响着终端用户的视觉体验。传统人工贴合方式难以满足当前超窄边框、高分辨率显示屏的严苛要求…

VScode-py环境

settings.json {"git.ignoreLimitWarning": true,"code-runner.runInTerminal": true,"code-runner.executorMap": {"python": "python3"} } 第二句话保证在终端里面进行IO 第三句话保证python3的用户不会执行python关键…

用键盘实现控制小球上下移动——java的事件控制

本文分享Java的一个有趣小项目&#xff0c;实现用键盘控制小球的移动 涉及java知识点&#xff1a;Swing GUI框架&#xff0c;绘图机制&#xff0c;事件处理&#xff0c;焦点控制 1.编写窗口和面板 (1.)定义面板类 Panel 继承自Java 自带类JPanel (2.)定义窗口类 window 继承…

《马尼拉》桌游期望计算器

《马尼拉》桌游期望计算器&#xff1a;做出最明智的决策 注&#xff1a;本项目仍在开发验证中&#xff0c;计算结果可能不够准确&#xff0c;欢迎游戏爱好者提供协助&#xff01; 在线使用 | GitHub 项目简介 马尼拉期望计算器是一个基于 Vue 3 Vite 开发的网页应用&#xff…

动态LOD策略细节层级控制:根据视角距离动态简化远距量子态渲染

动态LOD策略在量子计算可视化中的优化实现 1. 细节层级控制:动态简化远距量子态渲染 在量子计算的可视化中,量子态通常表现为高维数据(如布洛赫球面或多量子比特纠缠态)。动态LOD(Level of Detail)策略通过以下方式优化渲染性能: 距离驱动的几何简化: 远距离渲染:当…

线程池的介绍

目录 一、什么是线程池 二、线程池的详细内容 三、线程池的简化 一、什么是线程池 提到线程池&#xff0c;我们可能想到 常量池&#xff0c;可以先来说说常量池&#xff1a; 像是字符串常量&#xff0c;在Java程序最初构建的时候&#xff0c;就已经准备好了&#xff0c;等程…

安恒安全渗透面试题

《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…

计算机是如何工作的(上)

对于学习JavaEE初阶为什么要知道计算机是如何工作的&#xff0c;是因为在未来我们写代码的时候&#xff0c;会出现一些bug&#xff0c;而在代码层面是看不出来的&#xff0c;所以我们需要了解一些关于计算机内部是如何工作的&#xff0c;从而提高代码的健壮度。 计算机的组成&…

基础服务系列-Windows10 安装AnacondaJupyter

下载 https://www.anaconda.com/products/individual 安装 安装Jupyter 完成安装 启动Jupyter 浏览器访问 默认浏览器打开&#xff0c;IE不兼容&#xff0c;可以换个浏览器 修改密码 运行脚本

Kubernetes架构介绍

实验环境 安装好k8s集群 一、kubernetes组件构成 1、架构图 2、组件介绍 使用以下命令查看相关资源 kubectl get nodes 查看群集节点 kubectl get ns 查看名称空间 kubectl get pod -A …