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]\) 中有多少奇数。
分三类讨论。
- \(l,r\) 均为奇数
\(ans=(r-l)\div2+1\)
- \(l,r\) 一奇一偶
\(ans=(r-l+1)\div2\)
- \(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;
}