【 整数奇偶性运算法则】洛谷 P9231 [蓝桥杯 2023 省 A] 平方差
前言
整数奇偶性运算法则也称为奇偶律,主要包含以下运算规则:
- 奇数 × 奇数 = 奇数
- 偶数 × 任何数 = 偶数
- 奇数 + 奇数 = 偶数
- 奇数 + 偶数 = 奇数
- 偶数 + 偶数 = 偶数
题目
https://www.luogu.com.cn/problem/P9231
题解
首先列出所有完全平方数:
\(0,1,4,9,16,...,n^2,...\)
根据公式 \(a_i-a_{i-1},i \geq 2\) 可得:
\(a_2-a_1=1,a_3-a_2=3,a_4-a_3=5...\)
根据数学归纳法,可得:
\(a_i-a_{i-1}=2 \times {i-1} + 1\)
\(\therefore x\) 为奇数的情况都可以满足。
当 \(x\) 为偶数时,根据整数奇偶性运算法则可知 \(y,z\) 的奇偶性必定相同:
- 当 \(y,z\) 均为偶数时,\(x=(y-z) \times (y-z),\because (y-z)\) 是偶数,\(\therefore x\) 必定是 \(2\) 的偶数倍;
- 当 \(y,z\) 均为奇数时,\(x=(y-z) \times (y-z),\because (y-z)\) 时偶数,\(\therefore x\) 必定是 \(2\) 的偶数倍。
综上,只需要计算出 \(r-l+1\) 减去 \([l,r]\) 中 \(2\) 的奇数倍的数的数量,即为答案。
参考代码
#include<iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int l, r;
cin >> l >> r;
int ans = r - l + 1;// 统计出 [l, r] 共多少个数
// 维护出 [l, r] 范围内,最小和最大的满足除以 2 以后是奇数的数
// 维护出最小的满足除以 2 以后是奇数的数,不妨记为 l'
while (!(l % 2 == 0 && l / 2 % 2)) {
++ l;// 计算完以后就是 l'
}
// 维护出最大的满足除以 2 以后是奇数的数,不妨记为 r'
while (!(r % 2 == 0 && r / 2 % 2)) {
-- r;// 计算完以后就是 r'
}
// 有可能 l' > r',说明 [l, r] 中不存在满足除以 2 以后是奇数的数
if (l <= r) {
ans -= (r - l) / 4 + 1;// 若存在,需要把这些数的数量扣掉
}
cout << ans << '\n';
return 0;
}
浙公网安备 33010602011771号