求助,为什么不能这么做
查看原帖
求助,为什么不能这么做
188970
Twiter_ln楼主2024/5/2 18:42

二进制 + 比大小

在 异或数B异或数B 的二进制下,陪凑 XX 和 YY,大小分一下;同时记录下 SumSum,和 加和A加和A 比大小,判断这位是 0 or 1,但是第11个点炸了

评测记录

#include<iostream>
#include<cstdio>

using namespace std;
typedef unsigned long long ull;

ull a, b; // a+b and a^b
ull x[70], y[70];
ull m[70];

inline ull sol(ull s[]) {
	ull tt = 0;
	for(int i=64;i>=1;--i) {
		if(s[i]) tt += m[i];
	}
	return tt;
}

int main() {
	
	scanf("%llu%llu", &a, &b);
	if(a < b) {
		puts("-1");
		return 0;
	}
	
	
	m[1] = 1;
	for(int i=2;i<=64;++i) m[i] = m[i-1] << 1;
//	cout<<m[8]<<endl;
	
	int tag = 64;
	while(m[tag] > a) -- tag;
	
	ull sum = 0;
	for(int i=tag;i>=1;--i) {
		if((b >> (i-1)) & 1) {
			if(sum + m[i] <= a) {
				x[i] = 1;
				y[i] = 0;
				sum += m[i];
			}
			
		} else {
			if(sum + 2*m[i] <= a) {
				x[i] = 1;
				y[i] = 1;
				sum += 2*m[i];
			} else {
				x[i] = 0;
				y[i] = 0;
			}
		}
		
	}
	
//	for(int i=tag+1;i>=1;--i) printf("%5d ", m[i]);
//	putchar('\n');
//	for(int i=tag+1;i>=1;--i) printf("%5d ", x[i]);
//	putchar('\n');
//	for(int i=tag+1;i>=1;--i) printf("%5d ", y[i]);
//	putchar('\n');
	
	ull ans1 = 0, ans2 = 0;
	ans1 = sol(x);
	ans2 = sol(y);
//	printf("%llu %llu\n", ans1, ans2);
	
	if(ans1 + ans2 != a) puts("-1");
	else printf("%llu %llu\n", ans2, ans1);
	
	return 0;
}
/*

142 76
: 33 109

*/
2024/5/2 18:42
加载中...