P8567 [JRKSJ R6] Nothing 题解

Description

给定一个区间 \([l,r]\),求有多少个 \(i\in [l,r]\),满足 \(f(i) < f(i+1)\)。其中 \(f(x)\) 表示 \(x\) 在二进制下 \(1\) 的最低位置。

Solution

看到二进制,首先考虑奇偶。

  • \(x\) 为奇数,则 \(f(x)=1\),因为 \(2\nmid x\)
  • \(x\) 为偶数,则 \(f(x)>1\),因为 \(2\mid x\)

代入题目:

\(i\equiv 1\pmod {2}\),则 \(2\mid i+1\)

\(f(i)<f(i+1)\)

题意转换为 \([l,r]\) 中有多少奇数。

分三类讨论。

  1. \(l,r\) 均为奇数

\(ans=(r-l)\div2+1\)

  1. \(l,r\) 一奇一偶

\(ans=(r-l+1)\div2\)

  1. \(l,r\) 均为偶数

\(ans=(r-l)\div2\)

代码实现难度不大。

Code

#include<bits/stdc++.h>
using namespace std;
int t;
long long l,r;   //记得开long long
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>t;
    while(t--){
        cin>>l>>r;
        if(l%2==1&&r%2==1){
            cout<<(r-l)/2+1<<endl;
        }else if(l%2==1||r%2==1){
            cout<<(r-l+1)/2<<endl;
        }else{
            cout<<(r-l)/2<<endl;
        }
    }
  return 0;
}
posted @ 2023-02-23 10:35  larryyu_blog  阅读(17)  评论(0编辑  收藏  举报