題目鏈接:XOR
x ^ 4x ^ 5x == 0
其實就是 x ^ 4x == 5x
所以根據異或不進位的法則,我們可以發現就是不能出現111和101這種情況,直接數位dp即可。
AC代碼:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=70;
int dp[N][2][2],l,r,a[N];
int dfs(int pos,int pre1,int pre2,int lim){
if(!pos) return 1;
if(!lim&&dp[pos][pre1][pre2]!=-1) return dp[pos][pre1][pre2];
int up=lim?a[pos]:1,res=0;
for(int i=0;i<=up;i++){
if(pre1&&i) continue;
res+=dfs(pos-1,pre2,i,lim&&i==up);
}
if(!lim) dp[pos][pre1][pre2]=res;
return res;
}
int calc(int x){
int pos=0;
while(x) a[++pos]=x%2,x/=2;
return dfs(pos,0,0,1);
}
inline void solve(){
cin>>l>>r; memset(dp,-1,sizeof dp);
cout<<calc(r)-calc(l-1)<<'\n';
}
signed main(){
int T; cin>>T; while(T--) solve();
return 0;
}