专栏文章

题解:P1001 A+B Problem

P1001题解参与者 15已保存评论 14

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
14 条
当前快照
1 份
快照标识符
@mipczokv
此快照首次捕获于
2025/12/03 09:59
3 个月前
此快照最后确认于
2025/12/03 09:59
3 个月前
查看原文

题解:P1001 A+B Problem

首先我们需要知道三个性质。
  1. a+b=axorb+2×(aandb)a+b=a\operatorname{xor} b+2\times (a\operatorname{and} b)
  2. a+0=aa+0=a
  3. 0+a=a0+a=a
性质 11 的证明:
对于 a,ba,b 在二进制下的每一位都有四种情况。
  1. aa 在二进制下的第 ii 位为 11bb 在二进制下的第 ii 位为 11,则 1xor1+2×(1and1)=21\operatorname{xor} 1+2\times (1\operatorname{and} 1)=2
  2. aa 在二进制下的第 ii 位为 11bb 在二进制下的第 ii 位为 00,则 1xor0+2×(1and0)=11\operatorname{xor} 0+2\times (1\operatorname{and} 0)=1
  3. aa 在二进制下的第 ii 位为 00bb 在二进制下的第 ii 位为 11,则 0xor1+2×(0and1)=10\operatorname{xor} 1+2\times (0\operatorname{and} 1)=1
  4. aa 在二进制下的第 ii 位为 00bb 在二进制下的第 ii 位为 00,则 0xor0+2×(0and0)=00\operatorname{xor} 0+2\times (0\operatorname{and} 0)=0
发现以上四种情况都成立。
很显然,性质 2,32,3 成立。
有了这三条性质,我们就可以对 a,ba,b 一直进行变换,直到 a=0a=0b=0b=0 为止。
代码实现:
CPP
#include<bits/stdc++.h>
using namespace std;
int add(int a,int b){
	if(a==0) return b;
	if(b==0) return a;
	return add(a^b,2*(a&b));
}
int main(){
    int a,b;
	cin>>a>>b;
	cout<<add(a,b);
	return 0;
}

评论

14 条评论,欢迎与作者交流。

正在加载评论...