【刷题】蓝桥杯

蓝桥杯2023年第十四届省赛真题-平方差 - C语言网 (dotcpp.com)

初步想法,x = y2 − z2=(y+z)(y-z)

即x=a*b,a=y+z,b=y-z

2y=a+b

即a+b是2的倍数就好了。

即x存在两个因数之和为偶数就能满足条件。

但时间是(r-l)*x,数据1e9,直接T了

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
map<int,int> mp;
int cnt;

bool judge(int  x)
{
	for(int i=1;i<=x;i++)//找两个因数 
	{
		if(x%i!=0) continue;
		int d=x/i+i;
		if(d%2==0||x==1)//说明是整数 
		{
			return true; 
		} 
	}
	return false;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int l,r;
	cin>>l>>r; 
	
	for(int i=l;i<=r;i++)
	{
		if(judge(i)) cnt++; 
	}
	cout<<cnt;
    return 0;
}

运行结果:

进一步分析:

根据题意多写几个,不难发现奇数似乎都能拆成y2 − z2的形式?因此,我们从奇偶的角度来找规律。

那么,在这里就可以得出结论辣。想要数字能表示成y2-z2的形式,只有两种可能:

1.奇数 2.4的倍数

代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int cnt;

signed main()
{
	int l,r;
	cin>>l>>r; 
	
	for(int i=l;i<=r;i++)
	{
		if(i%2) cnt++;
		if(i%4==0) cnt++;
	}
	cout<<cnt;
    return 0;
}

(这一步还不能过属实有点钻牛角尖了。。。。。

但是好在,已知一个数x,对应的奇数、4的倍数的数的个数是可以算出来的。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int cnt;
signed main()
{
	int l,r;
	cin>>l>>r; 
	
	int d=(l-1)/2;
	if((l-1)%2==0) d--;
	
	int p=l/4;
	if((l%4)==0) p--;
	
	cnt=(r-1)/2-d+r/4-p;
	cout<<cnt;
    return 0;
}
相关推荐
励志不掉头发的内向程序员几秒前
【从零写一个CAD 02】画完第一条线之后:实体容器、Esc 取消,和按了没反应的键盘
开发语言·c++·qt·学习·系统架构
l1t5 分钟前
编译测试兼容gzip并行压缩解压工具pigz
c++·算法
无名猿17 分钟前
对象存储期全解:automatic / static / dynamic / thread
c++·内存管理·现代c++·语法基础
今天要早睡_27 分钟前
C++入门到精通:类和对象(下)全方位解析
android·c++
代码不停32 分钟前
BFS算法解决FloodFill问题
算法·bfs·宽度优先
艾莉丝努力练剑34 分钟前
【AI大模型接入SDK】ChatSDK架构设计与实现
网络·c++·人工智能·学习·语言模型
重生之小比特39 分钟前
【C++进阶】红黑树的实现
java·开发语言·c++
纪念 22940 分钟前
C++算法(一)
开发语言·c++·算法
All for pursuit.1 小时前
【二叉树-10】114.二叉树展开为链表
数据结构·c++·算法·leetcode·链表
叠层归一研究院1 小时前
区分预算与通道诱导:Ω–L叠层体系的观测赋值与定量验证
人工智能·算法