【洛谷 P9231】[蓝桥杯 2023 省 A] 平方差 题解(数学+平方差公式)

255 阅读1分钟

[蓝桥杯 2023 省 A] 平方差

题目描述

给定 L,RL,R,问 LxRL \leq x \leq R 中有多少个数 xx 满足存在整数 y,zy,z 使得 x=y2z2x=y^2-z^2

输入格式

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

输出格式

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

样例 #1

样例输入 #1

1 5

样例输出 #1

4

提示

【样例说明】

  • 1=12021=1^2-0^2
  • 3=22123=2^2-1^2
  • 4=22024=2^2-0^2
  • 5=32225=3^2-2^2

【评测用例规模与约定】

对于 40%40 \% 的评测用例,L,R5000L,R \leq 5000

对于所有评测用例,1LR1091 \leq L \leq R \leq 10^9

第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 A 组 C


思路

由平方差公式可知,x=y2z2x=y^2-z^2 可以拆分为x=(y+z)(yz)x=(y+z)(y-z)。易知 (y+z)(y+z)(yz)(y-z) 具有相同的奇偶性。当两者为奇数时,可以是1和x;当两者为偶数时,可以是2和x/2。则xx可以是奇数或者4的倍数。因此,程序通过计算区间内奇数的个数和4的倍数的个数,然后将两者相加,得到满足条件的xx的个数。

首先定义两个辅助函数aabb,函数aa用于求1到x的奇数个数,函数bb用于求1到x的4的倍数个数。

然后读取输入的两个数llrr。然后计算满足题目条件的xx的数量,即计算(a(r)a(l1))+(b(r)b(l1))(a(r) - a(l - 1)) + (b(r) - b(l - 1)),其中aabb是前面定义的两个函数。最后输出计算结果。


AC代码

#include <algorithm>
#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;

const int N = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;

// 求1到x的奇数个数
int a(int x) { return (x + 1) >> 1; }

// 求1到x的4的倍数个数
int b(int x) { return x / 4; }

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	int l, r;
	cin >> l >> r;
	cout << (a(r) - a(l - 1)) + (b(r) - b(l - 1)) << "\n";
	return 0;
}