k=0k = 0 时,内部为 11 当且仅当 x=yx = y,答案为 2n12^n - 1

k=1k = 1 时:

  • x=yx = ypopcount(x)=1\text{popcount}(x) = 1 时答案为 22x=yx = ypopcount(x)>1\text{popcount}(x) > 1 时答案为 11,这部分的答案为 2n+n12^n + n - 1
  • popcount(x)>1\text{popcount}(x) > 1 时拿掉一个二进制位 11 可以使得答案为 11,所有 nn 位二进制数中每位为 11 的频率均为 12\dfrac{1}{2},一共 2n1n2^{n - 1} \cdot n11,去掉 popcount(x)=1\text{popcount}(x) = 1 的情况后有 2n1nn2^{n - 1} \cdot n - n 个,考虑 (x,y)(x, y) 互换后这部分的答案为 2nn2n2^n \cdot n - 2n 个。
  • 上面两部分求和得到 (n+1)(2n1)(n + 1) \cdot (2^n - 1)
#include <bits/stdc++.h>
using namespace std;
long long p[32];
const int P = 998244353;
long long power(int x, long long y)
{
	y %= P - 1;
	long long ans = 1;
	for (int i = 29; i >= 0; i--)
		if (y & (1 << i)) ans = ans * p[i] % P;
	return ans;
}
int main()
{
	ios::sync_with_stdio(0);
	p[0] = 2;
	for (int i = 1; i <= 30; i++)
		p[i] = p[i - 1] * p[i - 1] % P;
	int T;
	cin >> T;
	while (T--)
	{
		long long n, k;
		cin >> n >> k;
		if (k == 0) cout << power(2, n) - 1 << '\n';
		if (k == 1) cout << (n + 1) % P * (power(2, n) - 1) % P << '\n';
	}
	return 0;
}