• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

RomanLin

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

【 整数奇偶性运算法则】洛谷 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;
}

posted on 2026-04-11 16:09  RomanLin  阅读(4)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3