CQOI 2015
刷题
Prob 1:[BZOJ 3930] 选数
给定 n,k,l,r ,询问:从[l,r]中选出n个数,使得Gcd(a1,a2,…,an)=k的方案数
莫比乌斯反演
我们设
f(x) 表示从[l,r]中选出n个数,使得Gcd(a1,a2,…,an)=k的方案数
同时设
g(x)=∑x∣df(d)=(⌊rx⌋−⌊l−1x⌋)n
g(x)是f(x)的倍数和,相当于是后缀和,而一般的莫比乌斯变换,是约数和,相当于前缀和
类比莫比乌斯反演的证明过程,我们容易证明:无论是约数和还是后缀和的莫比乌斯变换,都可以进行莫比乌斯反演
f(k)=∑k∣dμ(dk)g(d)
=∑j=1μ(j)⋅g(j⋅k)
=∑j=1rμ(j)⋅(⌊rj⋅k⌋−⌊l−1j⋅k⌋)n
后面的那一坨分块搞,
μ(x)的前缀和怎么办?
题目的数据范围
109……筛法会挂……
下面介绍一个比较神奇的
sum(x)=∑Ni=1μ(i)的求法
sum(x)=1−∑i=2Nsum(⌊Ni⌋)
证明如下:
sum(x)=∑i=1Nμ(i)
=1+∑i=2Nμ(i)
∵[i=1]=∑d∣iμ(d)=∑d∣i,d≠iμ(d)+μ(i)
∴μ(i)=[i=1]−∑d∣i,d≠iμ(d)
原式=1−∑i=2N∑d∣i,d≠iμ(d)
=1−∑dμ(d)∑i=2N[d∣i ∧ d≠i]
=1−∑dμ(d)(⌊Nd⌋−1)
=1−∑dμ(d)∑i=2N[d≤⌊Ni⌋]
=1−∑i=2N∑d=1⌊Ni⌋μ(d)
=1−∑i=2Nsum(⌊Ni⌋)
这样一来,我们就可以来搞了
通过记忆化搜索,我们可以得到
Θ(N34)的算法
但是这样还不够
我们设定一个阈值,预处理出小于阈值的sum值
对于大于阈值的进行记忆化搜索
根据计算:
Θ(N23)+∑i=2N13Θ(Ni−−−√)=Θ(N23+∫N132Nx−−−√dx)=Θ(N23)
所以,我们将阈值设置为
N23,也就是
106
至此,问题完美解决。