二进制:
多组输入:每组给出L,R,求出L,R范围中每一个数字二进制1的个数的总和。
范围:1<=T<=2e5 , 0<=L<=R<=6e7
6e7大概是2的26次方,直接枚举6e7个数字的26位,是会超时的,这里需要用到lowbit,其实见过很多次了。
lowbit函数中return x&(-x) 。-x是x的补码(补码是x是原码全部取反,然后+1),eg:5的二进制是101,补码是011,然后&运算就是011。所以lowbit的功能就是范围该数字的最后一位1的位置,然后一直减lowbit就能求出该数字二进制1的个数。
正解:
#include<bits/stdc++.h> using namespace std; const int N=6e7+9; int pri[N]; int lowbit(int x){return x & (-x);} void init(){ for(int i=0;i<=N;i++){ int n=i,ans=0; while(n){ n-=lowbit(n); ans++; } pri[i]=pri[i-1]+ans; } } int main() { ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); init(); int t; cin>>t; while(t--){ int l,r; cin>>l>>r; cout<<pri[r]-pri[l-1]<<'\n'; } return 0; }