[蓝桥杯 2023 省 A] 平方差

题目链接

[蓝桥杯 2023 省 A] 平方差

题目描述

给定 L , R L,R L,R,问 L ≤ x ≤ R L \leq x \leq R LxR 有多少个 x x x 满足存在整数 y , z y,z y,z 使得 x = y 2 − z 2 x = y^2 - z^2 x=y2z2

输入格式

输入一行包含两个整数 L , R L,R L,R,用一个空格分隔。

输出格式

输出一行包含一个整数满足题目给定条件的 x x x 的数量。

输入输出样例
输入

1 5

输出

4

说明/提示
  • 1 = 1 2 − 0 2 1 = 1^2 - 0^2 1=1202
  • 3 = 2 2 − 1 2 3 = 2^2 - 1^2 3=2212
  • 4 = 2 2 − 0 2 4 = 2^2 - 0^2 4=2202
  • 5 = 3 2 − 2 2 5 = 3^2 - 2^2 5=3222
数据范围
  • 1 ≤ L , R ≤ 1 0 9 1 \leq L,R \leq 10^9 1L,R109

解法:数学 + 找规律

对于原式 x = y 2 − z 2 x = y^2 - z^2 x=y2z2,可以转换为 x = ( y + z ) ( y − z ) x = (y + z)(y-z) x=(y+z)(yz),令 a = y + z , b = y − z a = y + z, b = y - z a=y+z,b=yz,即 x = a × b x = a \times b x=a×b

因为 a − b = ( y + z ) − ( y − z ) = 2 z a - b = (y + z) - (y - z) = 2z ab=(y+z)(yz)=2z

所以 a a a b b b 之差一定是偶数,所以 a , b a ,b a,b 只能是 奇数和奇数 或者 偶数和偶数

1. a , b a,b a,b 都是 奇数 的情况:
a , b a,b a,b 都是奇数,那么 a × b a \times b a×b 也是奇数,所以 x x x 也是奇数,那么 [ L , R ] [L,R] [L,R] 范围内的奇数都满足条件。

2. a , b a,b a,b 都是 偶数 的情况:
a , b a,b a,b 都是偶数,那么 a × b a \times b a×b 也是偶数并且是 4 4 4 的倍数,所以 x x x 也是 4 4 4 的倍数,那么 [ L , R ] [L,R] [L,R] 范围内的 4 4 4 的倍数都满足条件。

如果要求 [ 1 , n ] [1,n] [1,n] 范围内的 奇数 个数,那就是 ⌈ n 2 ⌉ \lceil \frac{n}{2} \rceil 2n

举例,有 n u m s [ 9 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } nums[9] = \{ 1,2,3,4,5,6,7,8,9 \} nums[9]={1,2,3,4,5,6,7,8,9},那么奇数个数就为 ⌈ 9 2 ⌉ = 5 \lceil \frac{9}{2} \rceil = 5 29=5

如果要求 [ 1 , n ] [1,n] [1,n] 范围内的 4的倍数 个数,那就是 ⌊ n 4 ⌋ \lfloor \frac{n}{4} \rfloor 4n

举例,有 n u m s [ 9 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } nums[9] = \{ 1,2,3,4,5,6,7,8,9 \} nums[9]={1,2,3,4,5,6,7,8,9},那么4的倍数个数就为 ⌊ 9 4 ⌋ = 2 \lfloor \frac{9}{4} \rfloor = 2 49=2

如此我们就可以定义一个函数 f u n ( i ) fun(i) fun(i),求出 [ 1 , i ] [1,i] [1,i] 区间内所有满足条件的 x x x 的数量 ,最终返回的答案就是 f u n ( R ) − f u n ( L − 1 ) fun(R) - fun(L-1) fun(R)fun(L1)

时间复杂度: O ( 1 ) O(1) O(1)

C++代码:

#include <iostream>

using namespace std;

int fun(int x){
    return (x + 1) / 2 + x / 4;
}

int main(){
    int l, r;
    cin>>l>>r;
    
    int ans = fun(r) - fun(l - 1);
    cout<<ans<<'\n';
}

Java代码:

import java.util.*;
import java.io.*;

public class Main {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static int n;
	
	public static int fun(int x) {
		return (x + 1) / 2 + x / 4;
	}
	
	public static void main(String[] args) throws Exception 
	{
		int l;
		int r;
		String[] str = in.readLine().split(" ");
		l = Integer.parseInt(str[0]);
		r = Integer.parseInt(str[1]);
		
		int ans = fun(r) - fun(l - 1);
		
		System.out.println(ans);
	}
}
  • 18
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
蓝桥杯2023年B组C++赛的题目包括了2个填空题和8个编程题。根据参赛者的博客\[1\],本届蓝桥杯的难度相较于上届有所增加,编程题的难度较大,而思维题的数量较少。参赛者在博客中提到了其中一个题目,即试题A:日期统计\[2\]。在博客中还提到了一种解题方法,即暴力枚举\[3\]。暴力枚举的代码如下: ```cpp #include <iostream> #include <cmath> #include <algorithm> using namespace std; const int total = 23333333; const double H = 11625907.5798; int main() { for (int i = 0; i < total / 2; i++) { double ans = 0; ans -= 1.0 * i * i / total * log2(1.0 * i / total); ans -= 1.0 * (total - i) * (total - i) / total * log2(1.0 * (total - i) / total); if (abs(ans - H) < 1e-4) { cout << i << endl; return 0; } } return 0; } ``` 以上是关于蓝桥杯2023年B组C++赛的一些信息。希望对你有所帮助! #### 引用[.reference_title] - *1* *3* [2023年第十四届蓝桥杯C++B组复盘](https://blog.csdn.net/m0_46326495/article/details/130043563)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [2023第十四届蓝桥杯C++B组题目回顾与参赛感想](https://blog.csdn.net/BinBinCome/article/details/130048888)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值