2024杭电多校1——1008位运算

Problem Description

小丁最近对位运算很感兴趣,通过学习,他知道了按位与 ⊗,按位异或 ⊕,以及按位或 ⊖ 三种常见位运算。

按位与 ⊗:二进制下每一位做与,即 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,2^{k}) 中的整数 𝑛,小丁想要知道,有多少组也在 [0,2^{k}) 中的整数 𝑎,𝑏,𝑐,𝑑,满足:𝑎⊗𝑏⊕𝑐⊖𝑑=𝑛

注意,运算符是从左往右依次顺序结合的,即可以认为原表达式为:(((𝑎⊗𝑏)⊕𝑐)⊖𝑑)=𝑛

Input

本题单个测试点内包含多组测试数据。

第一行一个整数 𝑇(1≤𝑇≤10),表示数据组数。

对于每组数据,一行两个整数 𝑛,𝑘(1≤𝑘≤15,0≤𝑛<2^{k})。

Output

对于每组数据输出 𝑞 行,每行一个整数表示答案。

 核心代码
void solve()
{
    int t;
	cin >> t;
	while (t--) {
		int n, k, sum = 0;
		cin >> n >> k;
		sum = pow(4,k);
		int j = 0;
		rep(p, 0, 62) {
			if ((n >> p) & 1) j++;
		}
		sum *= pow(3,j);
		cout << sum << "\n";
}
图解

以n=1,k=2为例。无论n等于0还是1,a和b都可以任取[0,2^{k}),所以对于每一位来说,ab有4种组合;

(以下都为单个位数的讨论)

n=0时,d必须为0,(a&b^c)必须为0,故cd只有1种组合

n=1时,d=0,(a&b^c)必须为1;d=1,abc任取,故cd有3种组合

因此,abcd的数据组数为4^{k}*3^{cnt1},(cnt1为n中位数为1的个数)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值