卧薪尝胆,厚积薄发。
选数
Date: Sun Mar 17 21:01:13 CST 2019
In Category:
NoCategory
Description:
有
$n$
个数
$A_1,A_2,\dots,A_n$
,在其中选出恰好
$k$
个数
$B_1,B_2,\dots,B_k$
,满足
$B_1\text{ xor }B_2\text{ xor }\cdots\text{ xor }B_k=s$
。求对于每一种选法的
$\gcd(B_1,B_2,\dots,B_k)$
之和。
$1\leqslant n\leqslant 10^6,1\leqslant k\leqslant 4,1\leqslant A\leqslant 5\times 10^4$
Solution:
首先那个
$\gcd$
很不好做,考虑莫比乌斯反演把
$\gcd$
解决掉,设
$g[i]$
表示最终答案为
$i$
的方案数,那么答案为:
$$
ans=\sum_{i=1}^ng[i]\times i
$$
设
$f[i]$
表示最终
$\gcd$
为
$i$
的倍数的方案数,那么有:
$$
f[i]=\sum_{i|d}^ng[d]
$$
由莫比乌斯反演得:
$$
g[i]=\sum_{i|d}^n\mu[\frac di]f[d]
$$
那么答案为:
$$
ans=\sum_{i=1}^ni\times \sum_{i|d}^n\mu[\frac di]f[d]=\sum_{d=1}^nf[d]\sum_{i|d}\mu[\frac di]i=\sum_{d=1}^nf[d]\varphi[d]
$$
关于异或,我们不难想到
$FWT$
,在计算
$f[d]$
的时候,我们可以把所有
$d$
的倍数都插到数组中,然后把这个数组
$k$
次幂,得到的
$s$
那一位的值就是答案。
但是这样单次复杂度为
$m\log m$
无法通过本题,我们可以用值域分块的方法,对于小于等于
$L$
的
$d$
,我们用
$FWT$
计算,对于其他的
$d$
,
$d$
的倍数只有不超过
$m/L$
个,我们可以用
$\text{meet in the middle}$
来求,复杂度为
$L\times A\log A+(\frac nL)^2$
,当
$L=\sqrt n$
时复杂度为
$A\sqrt n log A$
。
最后由于要求每个数互不相同的方案数,因此要容斥,
Code:
In tag:
数学-多项式-快速沃尔什变换 数学-莫比乌斯反演
Copyright © 2020
wjh15101051
ღゝ◡╹)ノ♡