时间限制 | 内存限制 |
---|---|
1000 ms |
65536 KB |
# 题目描述
Xhescia 首先需要知道事情一共有多少种发展的可能情况。
经过 Xhescia 的计算,总的情况数为以下方程的非负整数解的数量。
其中 为未知数, 为给定的非负整数。 代表按位或。
现在,你来帮 Xhesica 算一算吧。
# 输入格式
一行,一个数字 ,满足
# 输出格式
一行,一个整数。
# 输入样例
1 |
# 输出样例
2 |
# 样例解释
可以取 或者 。
# 题解:位运算
考虑按位或的特点:如果一个数是 ,那么结果一定是 。
于是我们将 的二进制拆开,按位依次考虑。如果这一位是 ,那么 这一位可取 也可取 ,因为这一位或出来的结果都是 ;如果这一位是 ,那么 这一位只能取 ,才能保证或出来的结果是 。
由于按位或对每一位的运算是独立的,我们把 每一位可能的取值情况相乘即可得到答案,即答案为 ,其中 表示 在二进制表示下有多少位为 。
时间复杂度为 。
参考代码:
#include <stdio.h> | |
typedef long long ll; | |
ll a; | |
int main() | |
{ | |
// freopen("A.in", "r", stdin); | |
// freopen("A.out", "w", stdout); | |
scanf("%lld", &a); | |
int cnt = 0; | |
while (a) | |
{ | |
cnt += a & 1; | |
a >>= 1; | |
} | |
printf("%lld\n", 1ll << cnt); | |
return 0; | |
} |