Codeforces Round #737 (Div. 2) 1557. C. Moamen and XOR(组合数,位)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #737 (Div. 2) 1557. C. Moamen and XOR(组合数,位)相关的知识,希望对你有一定的参考价值。

LINK

题意

构造一个长 n n n的数组 a a a,使得 a i ∈ [ 0 , 2 k − 1 ] a_i\\in[0,2^k-1] ai[0,2k1]

且满足 a 1 & a 2 & a 3 . . . & a n = a 1 ⊕ a 2 ⊕ a 3 . . . ⊕ a n a_1\\&a_2\\&a_3...\\&a_n=a_1\\oplus a_2 \\oplus a_3...\\oplus a_n a1&a2&a3...&an=a1a2a3...an

求方案数


考虑从二进制高位依次考虑到低位

在之前的位与值和异或值相等,这部分方案是 p r e pre pre,现在考虑在第 i i i位与值更大

Ⅰ.在这一位,数组的与已经大于数组的异或

那么必定数组与起来是 1 1 1,而异或起来是 0 0 0

也就是所有 a i a_i ai在这一位都必须取 1 1 1,此时 n n n 1 1 1异或

n n n为偶数,显然可行,那么后面的 k − i k-i ki位二进制怎么取都无所谓,每个数都有 2 k − i 2^{k-i} 2ki取法

所以答案加上 p r e ∗ ( 2 k − i ) n pre*(2^{k-i})^n pre(2ki)n

n n n为奇数,不可行,奇数个 1 1 1异或起来还是 1 1 1,还是相等

Ⅱ.在这一位,数组的与等于数组的异或

考虑当数组与为 1 1 1,异或也为 1 1 1,显然只有当 n n n取奇数,这一位二进制全取 1 1 1有一种解法

考虑当数组与为 0 0 0,异或也为 0 0 0,也就是选择偶数个位置这一位填充 1 1 1,其余位置填充 0 0 0

方案数为 ∑ i % 2 = = 0 ( n i ) = 2 n − 1 \\sum\\limits_{i\\%2==0}\\binom{n}{i}=2^{n-1} i%2==0(in)=2n1(这个可以用二项式定理推导)

所以 n n n为奇数时, p r e + = 2 n − 1 + 1 pre+=2^{n-1}+1 pre+=2n1+1,因为此时 n n n个数可以全为 1 1 1,所以多了一种方案

n n n为偶数时, p r e + = 2 n − 1 − 1 pre+=2^{n-1}-1 pre+=2n11,因为此时 n n n个数不能全为 1 1 1,所以少了一种方案

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 3e5+10;
const int mod = 1e9+7;
int t,n,k,inv[maxn];
int quick(int x,int n)
{
	int ans = 1;
	for( ; n ; n>>=1,x=x*x%mod )
		if( n&1 )	ans = ans*x%mod;
	return ans;
}
void upd(int &x,int y){ x = (x+y)%mod; }
signed main()
{
	inv[0] = 1;
	for(int i=1;i<=200000;i++) 	inv[i] = inv[i-1]*2%mod;
	cin >> t;
	while( t-- )
	{
		cin >> n >> k;
		int ans = 0,pre = 1;
		for(int i=1;i<=k;i++)
		{
			if( n%2==0 )
			{ 
				upd( ans,pre*quick( inv[k-i],n )%mod );
				pre = pre*( inv[n-1]-1 )%mod;
			}
			else
				pre = pre*( inv[n-1]+1 )%mod;
		}
		upd( ans,pre );
		cout << ( ans%mod+mod )%mod << endl;
	}
}

以上是关于Codeforces Round #737 (Div. 2) 1557. C. Moamen and XOR(组合数,位)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #737 (Div. 2) 题解

Codeforces Round #737 (Div. 2) 题解

Codeforces Round #737 (Div. 2) 题解

Codeforces Round #737 (Div. 2) Ezzat and Grid(线段树优化dp)

Codeforces Round #737 (Div. 2)(补题)

Codeforces Round #737 (Div. 2) C