组合计数 - Moamen and XOR - CF 1557C
题意:
给 定 一 个 长 度 为 n 的 非 负 整 数 序 列 a , 其 中 每 个 元 素 均 小 于 2 k 给定一个长度为n的非负整数序列a,其中每个元素均小于2^k 给定一个长度为n的非负整数序列a,其中每个元素均小于2k
要 求 满 足 : 要求满足: 要求满足:
a 1 & a 2 & a 3 & . . . & a n ≥ a 1 ⊕ a 2 ⊕ a 3 ⊕ . . . ⊕ a n a_1\ \&\ a_2\ \&\ a_3\ \&...\ \&\ a_n\ge a_1\ \oplus\ a_2\ \oplus\ a_3\ \oplus\ ...\ \oplus\ a_n a1 & a2 & a3 &... & an≥a1 ⊕ a2 ⊕ a3 ⊕ ... ⊕ an
计 算 满 足 上 述 条 件 的 序 列 a 的 数 量 , 答 案 对 1 0 9 + 7 取 模 。 计算满足上述条件的序列a的数量,答案对10^9+7取模。 计算满足上述条件的序列a的数量,答案对109+7取模。
输入:
多 测 , 1 ≤ T ≤ 5 多测,1\le T\le 5 多测,1≤T≤5
每 组 测 试 数 据 包 括 : n 和 k ( 1 ≤ n ≤ 2 ⋅ 1 0 5 , 1 ≤ k ≤ 2 ⋅ 1 0 5 ) 每组测试数据包括:n和k\ \ (1\le n\le 2·10^5,1\le k\le 2·10^5) 每组测试数据包括:n和k (1≤n≤2⋅105,1≤k≤2⋅105)
输出:
一 个 整 数 , 表 示 答 案 一个整数,表示答案 一个整数,表示答案
Example
input
3
3 1
2 1
4 0
output
5
2
1
结论:
① 、 若 n 为 奇 数 : ①、若n为奇数: ①、若n为奇数:
A n s = ( 2 n − 1 + 1 ) k Ans=(2^{n - 1}+1)^k Ans=(2n−1+1)k
② 、 若 n 为 偶 数 : ②、若n为偶数: ②、若n为偶数:
A n s = ( 2 n − 1 − 1 ) k + ∑ i = 1 k ( 2 n − 1 − 1 ) i − 1 ⋅ ( 2 n ) k − i Ans=(2^{n - 1}-1)^k + \sum_{i=1}^k(2^{n-1}-1)^{i-1}·(2^n)^{k-i} Ans=(2n−1−1)k+i=1∑k(2n−1−1)i−1⋅(2n)k−i
分析:
题意本质上是求:选择n个k位二进制数,满足上述约束,计算合法方案总数。
因为二进制的每一位都是独立的,所以我们无须纠结具体的每一个数,仅需从运算结果入手分析,
单独分析结果每一位,根据乘法原理,最后将每一位的合法方案数累乘即可。
记 L = & i = 1 n a i , R = ⊕ i = 1 n a i 记L=\&_{i=1}^na_i,R=\oplus_{i=1}^na_i 记L=&i=1nai,R=⊕i=1nai
记 L 的 二 进 制 表 示 , 第 i 位 数 为 L i ; 同 理 有 R i 。 记L的二进制表示,第i位数为L_i;同理有R_i。 记L的二进制表示,第i位数为Li;同理有Ri。
记 a j 的 二 进 制 表 示 , 第 i 位 数 为 a j i 。 记a_j的二进制表示,第i位数为a_{ji}。 记aj的二进制表示,第i位数为aji。
我 们 粗 略 的 分 析 : 我们粗略的分析: 我们粗略的分析:
若 对 于 1 ≤ i ≤ m , L i = R i , \qquad若对于1\le i\le m,L_i=R_i, 若对于1≤i≤m,Li=Ri,
当 L i + 1 = R i + 1 时 , L 才 可 能 等 于 R ; \qquad当L_{i+1}=R_{i+1}时,L才可能等于R; 当Li+1=Ri+1时,L才可能等于R;
当 L i + 1 > R i + 1 时 , L 必 大 于 R 。 \qquad当L_{i+1}>R_{i+1}时,L必大于R。 当Li+1>Ri+1时,L必大于R。
又 因 为 , 结 果 的 每 一 位 都 是 独 立 的 , 而 结 果 的 每 一 位 和 1 的 个 数 的 奇 偶 性 相 关 , 所 以 下 面 分 奇 偶 讨 论 : 又因为,结果的每一位都是独立的,而结果的每一位和1的个数的奇偶性相关,所以下面分奇偶讨论: 又因为,结果的每一位都是独立的,而结果的每一位和1的个数的奇偶性相关,所以下面分奇偶讨论:
① 、 当 n 为 奇 数 ①、当n为奇数 ①、当n为奇数
若 存 在 a j i = 0 ( 1 ≤ i ≤ k ) , 则 L i = 0 , L i ≤ R i ; 若 L i = 1 , 奇 数 个 1 异 或 仍 为 1 , 即 R i = 1 , 此 时 L i = R i 。 \qquad若存在a_{ji}=0(1\le i\le k),则L_i=0,L_i\le R_i;\\\ \\\qquad若L_i=1,奇数个1异或仍为1,即R_i=1,此时L_i=R_i。 若存在aji=0(1≤i≤k),则Li=0,Li≤Ri; 若Li=1,奇数个1异或仍为1,即Ri=1,此时Li=Ri。
可 见 : 当 n 为 奇 数 时 , L i 只 可 能 等 于 R i , 即 L 只 能 等 于 R 。 下 面 我 们 详 细 讨 论 每 一 位 的 值 : \qquad可见:当n为奇数时,L_i只可能等于R_i,即L只能等于R。下面我们详细讨论每一位的值: 可见:当n为奇数时,Li只可能等于Ri,即L只能等于R。下面我们详细讨论每一位的值:
Ⅰ 、 L i = R i = 1 , 此 时 仅 有 1 种 情 况 : ∀ j ∈ [ 1 , n ] , a j i = 1 \qquadⅠ、L_i=R_i=1,此时仅有1种情况:\forall j\in[1,n],a_{ji}=1 Ⅰ、Li=Ri=1,此时仅有1种情况:∀j∈[1,n],aji=1
Ⅱ
、
L
i
=
R
i
=
0
,
此
时
我
们
需
要
选
择
偶
数
个
a
j
i
=
1
,
使
得
异
或
值
为
0
,
故
方
案
数
为
:
\qquad Ⅱ、L_i=R_i=0,此时我们需要选择偶数个a_{ji}=1,使得异或值为0,故方案数为:
Ⅱ、Li=Ri=0,此时我们需要选择偶数个aji=1,使得异或值为0,故方案数为:
C
n
0
+
C
n
2
+
C
n
4
+
.
.
.
+
C
n
n
−
1
=
C
n
1
+
C
n
3
+
.
.
.
+
C
n
n
−
2
+
C
n
n
=
2
n
2
=
2
n
−
1
C_n^{0}+C_n^{2}+C_n^{4}+...+C_n^{n-1}=C_n^{1}+C_n^{3}+...+C_n^{n-2}+C_n^{n}=\frac{2^{n}}{2}=2^{n-1}
Cn0+Cn2+Cn4+...+Cnn−1=Cn1+Cn3+...+Cnn−2+Cnn=22n=2n−1
所 以 , 当 n 为 奇 数 时 , A n s = ∏ i = 1 k ( 2 n − 1 + 1 ) = ( 2 n − 1 + 1 ) k 。 \qquad所以,当n为奇数时,Ans=\prod_{i=1}^k(2^{n-1}+1)=(2^{n-1}+1)^k。 所以,当n为奇数时,Ans=∏i=1k(2n−1+1)=(2n−1+1)k。
② 、 当 n 为 偶 数 ②、当n为偶数 ②、当n为偶数
类 比 情 况 ① , 我 们 可 以 分 析 出 合 法 方 案 为 : L ≥ R \qquad 类比情况①,我们可以分析出合法方案为:L\ge R 类比情况①,我们可以分析出合法方案为:L≥R
Ⅰ 、 左 边 等 于 右 边 , 只 可 能 有 L i = R i = 0 , 此 时 为 偶 数 个 1 ( 且 存 在 a j i = 0 ) , 即 不 全 为 1 \qquad Ⅰ、左边等于右边,只可能有L_i=R_i=0,此时为偶数个1(且存在a_{ji}=0),即不全为1 Ⅰ、左边等于右边,只可能有Li=Ri=0,此时为偶数个1(且存在aji=0),即不全为1
第 i 位 相 等 的 合 法 方 案 数 为 : \qquad\quad 第i位相等的合法方案数为: 第i位相等的合法方案数为:
C n 0 + C n 2 + C n 4 + . . . + C n n − 2 = C n 0 + C n 2 + C n 4 + . . . + C n n − 2 + C n n − C n n = 2 n − 1 − 1 C_n^0+C_n^2+C_n^4+...+C_n^{n-2}=C_n^0+C_n^2+C_n^4+...+C_n^{n-2}+C_n^n-C_n^n=2^{n-1}-1 Cn0+Cn2+Cn4+...+Cnn−2=Cn0+Cn2+Cn4+...+Cnn−2+Cnn−Cnn=2n−1−1
注 : 二 项 式 系 数 和 的 性 质 , S e v e n = S o d d = 2 n − 1 \qquad\quad 注:二项式系数和的性质,S_{even}=S_{odd}=2^{n-1} 注:二项式系数和的性质,Seven=Sodd=2n−1
Ⅱ 、 左 边 大 于 右 边 \qquad Ⅱ、左边大于右边 Ⅱ、左边大于右边
注 意 , L > R 无 须 任 意 的 L i > R i , 我 们 仅 需 保 证 前 i − 1 位 L i − 1 = R i − 1 , 第 i 位 L i = 1 且 R i = 0 即 可 。 \qquad\quad注意,L>R无须任意的L_i>R_i,我们仅需保证前i-1位L_{i-1}=R_{i-1},第i位L_i=1且R_i=0即可。 注意,L>R无须任意的Li>Ri,我们仅需保证前i−1位Li−1=Ri−1,第i位Li=1且Ri=0即可。
根 情 况 Ⅰ , 前 i − 1 位 相 等 的 合 法 方 案 数 为 : ( 2 n − 1 − 1 ) i − 1 ; 第 i 位 向 后 任 意 , 方 案 数 为 : ( 2 n ) k − i \qquad\quad 根情况Ⅰ,前i-1位相等的合法方案数为:(2^{n-1}-1)^{i-1};第i位向后任意,方案数为:(2^n)^{k-i} 根情况Ⅰ,前i−1位相等的合法方案数为:(2n−1−1)i−1;第i位向后任意,方案数为:(2n)k−i
故 合 法 方 案 数 为 : \qquad\quad故合法方案数为: 故合法方案数为:
∑ i = 1 k ( 2 n − 1 − 1 ) i − 1 ⋅ ( 2 n ) k − i \sum_{i=1}^k(2^{n-1}-1)^{i-1}·(2^n)^{k-i} i=1∑k(2n−1−1)i−1⋅(2n)k−i
故 n 为 偶 数 时 , 合 法 方 案 总 数 为 : \qquad 故n为偶数时,合法方案总数为: 故n为偶数时,合法方案总数为: A n s = ( 2 n − 1 − 1 ) k + ∑ i = 1 k ( 2 n − 1 − 1 ) i − 1 ⋅ ( 2 n ) k − i Ans=(2^{n - 1}-1)^k + \sum_{i=1}^k(2^{n-1}-1)^{i-1}·(2^n)^{k-i} Ans=(2n−1−1)k+∑i=1k(2n−1−1)i−1⋅(2n)k−i
代码:
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int N = 200010, mod = 1e9 + 7;
typedef long long ll;
int T, n, k;
ll ans, pow_2[N];
void init()
{
pow_2[0] = 1;
for(int i = 1; i < N; i ++)
pow_2[i] = pow_2[i - 1] * 2 % mod;
}
ll quick_pow(int a, int b)
{
ll res = 1;
while(b)
{
if(b & 1) res = res * a % mod;
a = (ll)a * a % mod;
b >>= 1;
}
return res;
}
int main()
{
init();
scanf("%d", &T);
while(T --)
{
scanf("%d%d", &n, &k);
ll ans = 0;
if(n & 1) ans = quick_pow(pow_2[n - 1] + 1, k);
else
{
ans = quick_pow(pow_2[n - 1] - 1, k);
ll sum = 0;
for(int i = 1; i <= k; i ++)
sum = (sum + quick_pow(pow_2[n - 1] - 1, i - 1) * quick_pow(pow_2[n], k - i) % mod) % mod;
ans = (ans + sum) % mod;
}
printf("%lld\n", ans);
}
return 0;
}