站外题求助卡常
  • 板块题目总版
  • 楼主sdyzpf
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/7/24 18:06
  • 上次更新2024/7/24 19:29:13
查看原帖
站外题求助卡常
174477
sdyzpf楼主2024/7/24 18:06
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization ("unroll-loops")
#include<bits/stdc++.h>
using namespace std;
int T,limit[65];
long long f[65][65][65];
signed pcnt;
long long dfs(signed pos,signed cnt1,bool islim){
	if(pos+1<cnt1||cnt1<0) return 0;
	if(pcnt==0) return 0;
	if(pos==0){
		if(cnt1==0) return 1;
		else{
			if(islim){
				if(limit[pos]&&pcnt==1) return 0;//只能选0
				if(limit[pos]) return 1;
				return 0;
			}
			else{
				if(pcnt==1) return 0;
				return 1;
			}
		}
	}
	else if(pos>pcnt+1){
		if(islim){
			if(limit[pos]) return dfs(pos-1,cnt1,0)+dfs(pos-1,cnt1-1,1);
			return dfs(pos-1,cnt1,1);
		}
		else{
			if(f[pos][pcnt][cnt1]!=-1) return f[pos][pcnt][cnt1];
			return f[pos][pcnt][cnt1]=dfs(pos-1,cnt1,0)+dfs(pos-1,cnt1-1,0);
		}
	}
	else if(pos==pcnt+1){//只能选1 
		if(islim){
			if(!limit[pos]) return 0;
			return dfs(pos-1,cnt1-1,1);
		}
		else{
			if(f[pos][pcnt][cnt1]!=-1) return f[pos][pcnt][cnt1];
			return f[pos][pcnt][cnt1]=dfs(pos-1,cnt1-1,0);
		}
	} 
	else if(pos==pcnt){
		if(islim){
			if(limit[pos]) return dfs(pos-1,cnt1,0)+dfs(pos-1,cnt1-1,1);
			return dfs(pos-1,cnt1,1);
		}
		else{
			if(f[pos][pcnt][cnt1]!=-1) return f[pos][pcnt][cnt1];
			return f[pos][pcnt][cnt1]=dfs(pos-1,cnt1,0)+dfs(pos-1,cnt1-1,0);
		}
	}
	else if(pos==pcnt-1){//只能选0 
		if(islim){
			if(limit[pos]) return dfs(pos-1,cnt1,0);
			return dfs(pos-1,cnt1,1);
		}
		else{
			if(f[pos][pcnt][cnt1]!=-1) return f[pos][pcnt][cnt1];
			return f[pos][pcnt][cnt1]=dfs(pos-1,cnt1,0);
		}
	}
	else if(pos<pcnt-1){
		if(islim){
			if(limit[pos]) return dfs(pos-1,cnt1,0)+dfs(pos-1,cnt1-1,1);
			return dfs(pos-1,cnt1,1);
		}
		else{
			if(f[pos][pcnt][cnt1]!=-1) return f[pos][pcnt][cnt1];
			return f[pos][pcnt][cnt1]=dfs(pos-1,cnt1,0)+dfs(pos-1,cnt1-1,0);
		}
	}
}
inline long long calc(unsigned long long lim){
	if(lim<0) return 0;
	limit[64]=0;
	for(int i=0;i<64;i++)
		if((lim>>i)&1) limit[i]=1;
		else limit[i]=0;
	long long res=0;
	for(int i=0;i<64;i++) pcnt=i,res+=dfs(64,i,1);
	return res;
}
signed main(){
//	freopen("function.in","r",stdin);
//	freopen("function.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	memset(f,-1,sizeof(f));
	cin>>T;
	while(T--){
		unsigned long long L,R;
		cin>>L>>R;
		if(L==0) cout<<(R+1)-calc(R)<<'\n'; 
		else cout<<(R-L+1)-(calc(R)-calc(L-1))<<'\n';
	}
	return 0;
}
2024/7/24 18:06
加载中...