• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
jacklee404
Never Stop!
博客园    首页    新随笔    联系   管理    订阅  订阅
幸运数-简单数论/找规律

幸运数

题目

试题 C: 平方差(数学 / 结论)

时间限制 : 1.0s
内存限制 : 256.0MB
本题总分:10 分

【问题描述】

给定 L, R,问 L ≤ x ≤ R 中有多少个数 x 满足存在整数 y,z 使得 x = y^ 2 − z^ 2 。

【输入格式】

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

【输出格式】

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

【样例输入】

1 5

【样例输出】

4

【样例说明】

1 = 1^ 2 − 0 ^ 2 ;
3 = 2^ 2 − 1 ^ 2 ;
4 = 2^ 2 − 0 ^ 2 ;
5 = 3^2 − 2 ^2 。

【评测用例规模与约定】

对于 40 % 的评测用例, \(L R ≤ 5000\) ;
对于所有评测用例, \(1 ≤ L ≤ R ≤ 10^9\) 。

思路

​ 看到题目数据,开始想\(O(log(R - L))\)的做法,但是发现貌似不能二分,后来看题解才知道这道题是个数论的题,需要找到规律。

首先我们考虑奇数情况下, 设\(x = 2k + 1\), 则我们可以想到一种构造方法:

下列参数\(k \in Z^+\)

\(x = (k + 1 + k) \times (k + 1 - k) = (k + 1)^2 - k^2\), 所以所有奇数都有平方差。

​ 偶数情况下, 我们考虑正整数最小的情况\(2^2 - 0^2 = 4\),考虑\(4k\)和\(4k+2\)覆盖的大于等于\(4\)的所有偶数,可以找到规律\(4k\)有解,\(4k + 2\)无解。

​ 对于\(4k\), 我们可以构造:

\(4k = 2 \times 2k = ((k + 1) - (k - 1)) + ((k + 1) + (k - 1)) = (k + 1)^2 + (k - 1)^2\)

​ 因为\((x + y)(x - y)\) 同奇偶,所以他们同偶, 而两个同偶数相乘必然是\(4\)的倍数, 而\(4k + 2\)仅仅为\(2\)的倍数,产生矛盾,所以\(4k + 2\)不存在解。

Code

#include <bits/stdc++.h>

using i64 = long long;

int main() {
	int l, r;

	std::cin >> l >> r;

	int len = r - l + 1;

	std::cout << (r / 4 - (l - 1) / 4) + (len - (r / 2 - (l - 1) / 2));	
}
posted on 2023-06-08 16:14  Jack404  阅读(79)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3