XOR

題目鏈接: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章