幸运数
题目
试题 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));
}