求助 CF C
  • 板块学术版
  • 楼主Simclover
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/1/10 22:21
  • 上次更新2023/10/24 04:49:07
查看原帖
求助 CF C
691749
Simclover楼主2023/1/10 22:21

RT,赛时拍了几十组都没错,求调或hack

#include<bits/stdc++.h>

using namespace std;

#define int long long

int n,x;
int an[100],ax[100];
int cntn,cntx;
int t;
int ans[100];
int ans1;

void solve(){
	cntn=cntx=0;
	memset(ax,0,sizeof(ax));
	memset(ans,0,sizeof(ans));
	memset(an,0,sizeof(an));
	scanf("%lld%lld",&n,&x);
	if(n==x){
		printf("%lld\n",n);
		return;
	}
	ans1=0;
	int n1=n,x1=x;
	while(n1){
		an[++cntn]=n1%2;
		n1/=2;
	}
	while(x1){
		ax[++cntx]=x1%2;
		x1/=2;
	}
	if(x==0){
		printf("%lld\n",1ll<<cntn);
		return;
	}
	if(x>n){
		printf("-1\n");
		return;
	}
	int cntx1=cntx;
	
	for(int i=cntx1+1;i<=cntx1+cntn-cntx1;i++){
		ax[++cntx]=0;
	}
	
	//for(int i=1;i<=cntn;i++) printf("%d ",an[i]);
	//puts("");
	//for(int i=1;i<=cntx;i++) printf("%d ",ax[i]);
	
	for(int i=1;i<=cntn;i++){
		if(ax[i]==1&&an[i]==0){
			printf("-1\n");
			return;
		}
		if(ax[i]==0&&an[i]==1){
			ans[i]=0;
		}
		if(ax[i]==1&&an[i]==1){
			ans[i]=1;
		}
	}
	for(int i=cntn;i>=1;i--){
		if(ans[i]==0&&an[i-1]&&ax[i-1]==0){
			ans[i]=1;
			break;
		}
	}
	for(int i=cntn;i>=1;i--){
		ans1+=ans[i];
		ans1*=2;
	}
	//printf("%lld\n",cntx1);
	cntn=cntx=0;
	memset(ax,0,sizeof(ax));
	memset(an,0,sizeof(an));
	
	int ans2=x==0?ans1:ans1/2;
	bool fg2=0;
	int j=0;
	ans1=0;
	int sum=n;
	
	/*for(int i=n;i<=ans2;i++){
		j++;
		if(j>500) break;
		if(!sum&&x!=0){
			fg2=1;
			break;
		}
	}*/
	printf("%lld\n",ans2<n||fg2?-1:ans2);
	ans1=0;
}

signed main(){
	scanf("%lld",&t);
	while(t--){
		solve();
	}
	return 0;
}
2023/1/10 22:21
加载中...