【刷题】蓝桥杯

蓝桥杯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;
}
相关推荐
要开心吖ZSH1 分钟前
软件设计师备考-(十六)数据结构及算法应用(重要)
java·数据结构·算法·软考·软件设计师
DDDDDDDRDDR6 分钟前
C++容器:list
开发语言·c++·stl
一拳一个呆瓜9 分钟前
【MFC】对话框属性:Use System Font(使用系统字体)
c++·mfc
Elnaij11 分钟前
从C++开始的编程生活(7)——取地址运算符重载、类型转换、static成员和友元
开发语言·c++
带娃的IT创业者14 分钟前
如何开发一个教育性质的多线程密码猜测演示器
网络·python·算法
郝学胜-神的一滴29 分钟前
Effective Modern C++ 条款26:避免在通用引用上重载
开发语言·c++·程序人生
草莓熊Lotso32 分钟前
【C++】递归与迭代:两种编程范式的对比与实践
c语言·开发语言·c++·经验分享·笔记·其他
Aczone282 小时前
硬件(六)arm指令
开发语言·汇编·arm开发·嵌入式硬件·算法
逐雨~3 小时前
9.8C++作业
开发语言·c++
luckys.one6 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链