切入点:对方程进行转化
目标:卡常
本体的暴力解法无疑很简单,5min写完喜提TLE、
所以,需要卡时间
化简方程
a - (a ^ x) - x = 0
a -x = a ^ x
解题思路
由于异或的运算需转化为二进制,所以可以按位进行运算、判定
当a = 0, x = 1, a-x =-1, a^x =1,不满足题意
当a = 0, x = 0, a-x = 0, a^x = 0,满足题意
当a = 1, x= 1, a - x = 0, a ^ x = 0, 满足题意
当a = 1, x= 0, a - x = 1, a ^ x = 1,满足题意
所以,在写代码的时候,可以直接判断,若a = 0,x有一种可能;若a = 1,则x有两种可能
代码实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
int t, n, cnt; // cnt为x的可能的解得数量
int main() {
cin >> t;
while(t --) { // 多组输入首选while循环
cin >> n; // 读入
cnt = 1; // 0乘任何数都是0,所以初始化为1
// 转二进制
while(n) {
if(n%2 == 1) { // n为1,则有两种可能的解
cnt *= 2; // 小学数学知识
}
n/=2; // 更新n
}
cout << cnt << endl; // 打印出cnt的值
}
return 0;
}