【刷题】蓝桥杯

蓝桥杯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;
}
相关推荐
find1star6 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing6 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21126 小时前
力扣160 21 86
算法·leetcode·职场和发展
Tairitsu_H7 小时前
[C++] 深入理解红黑树:封装set与map
开发语言·c++·set·map·红黑树·模拟实现
小智老师PMP7 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN7 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a187927218318 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤8 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate9 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran9 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分