8757: 位运算
小丁最近对位运算很感兴趣,通过学习,他知道了按位与 ⊗,按位异或 ⨁,以及按位或 ⊖ 三种常见位运算。
按位与 ⊗:二进制下每一位做与,即 0⊗0=0,0⊗1=0,1⊗0=0,1⊗1=1。
按位异或 ⨁:二进制下每一位做异或,即 0⨁0=0,0⨁1=1,1⨁0=1,1⨁1=0。
按位或 ⊖:二进制下每一位做或,即 0⊖0=0,0⊖1=1,1⊖0=1,1⊖1=1。
现在,对于一个在 [0,2k) 中的整数 n,小丁想要知道,有多少组也在 [0,2^k) 中的整数 a,b,c,d,满足:
a⊗b⨁c⊖d=n
注意,运算符是从左往右依次顺序结合的,即可以认为原表达式为:
(((a⊗b)⨁c)⊖d)=n
输入
本题单个测试点内包含多组测试数据。
第一行一个整数 T(1≤T≤10),表示数据组数。
对于每组数据,一行两个整数 n,k (1≤k≤15,0≤n<2k)。
输出
对于每组数据输出 q 行,每行一个整数表示答案。
样例输入
3
1 2
3 3
5 4
样例输出
48
576
2304
题目来源
2024“钉耙编程”中国大学生算法设计超级联赛(1)
要求在[0,2^k)有多少种可能使式子结果为 n ,我们可以枚举a,b,c,d末位分别为0 1 的情况,找出结果为1,0的情况数。
(如上图 计算过程就不画了,太难画 qwq)
得到结果是 1有12种情况,0有4种情况;
那么,就可以遍历所求 n 二进制的 末位 如果是’1‘则翻12倍,如果是’0‘翻4倍
就可以得到答案了。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve()
{
int n, k;
cin >> n >> k;
ll res=1,t=1;
for(int i=0;i<k;i++)
{
if(n&t) res*=12;
else res*=4;
t<<=1;
}
cout<<res<<endl;
}
int main()
{
int t;
cin >> t;
while (t--)
{
solve();
}
return 0;
}
END