公式推♂倒题

公式推♂倒题

国内ICPC中经常出现的一类问题!一般会给一个复杂度炒鸡吓人的式子,然后我们需要大力推倒他。把复杂度降到Accepted的范围。

一些前置技能点总结

跳跳狗

([frac{n}{i}])可以取到的值,个数是(O(sqrt n))级别的。

int nex=1;
for(int i=1;i<=n;i=nex+1) {
	nex=n/(n/i); // 对于[i,nex]区间内所有数字x,n/x相等。
}

如果需要计算,(sum_{i=1}^{n} [frac{n}{i}])这种东西,我们就可以把([frac{n}{i}])相同的(i),放在一起处理。


莫比乌斯函数

这个东西本身上就是容斥吖!一个经典的式子:(sum_{d|n} mu(d) = [n=1])

我们,把(n)分解质因子拆了(n=p_1^{a_1}p_2^{a_2}p_3^{a_3}...p_k^{a_k})

我们考虑(n)的因子(d),如果(mu(d))不为0,那么每个质因子在(d)里面的指数,要么是0,要么是1.

如果(d)包含奇数个质因子,那么(mu(d)=-1), 否则(mu(d)=1).

  • 所以(mu(d)=-1)(d)(C(k,1)+C(k,3)+....)个。
  • 所以(mu(d)=+1)(d)(C(k,0)+C(k,2)+....)个。

根据((1-1)^k)二项式定理的展开,当(n)不为1时,(sum_{d|n} mu(d)=0)

当然这个式子是可以进化的。

我们用类似的方法,同样也可以得到(sum_{d^2|n} mu(d) = mu(n)^2)

推倒的姿势

姿势1:考虑一下公因子,质因子什么的

按因子统计的问题。出现得相当多了。

栗子1:给出(n(nleq2000000)),计算:

(sum_{i=1}^{n} sum_{j=1}^{n} gcd(i,j))

做法:

我们按照gcd分类一下可化成。(sum_{g=1}^{n}(gsum_{i=1}^{n/g}sum_{j=1}^{n/g} [gcd(i,j)=1]))

(f(x)=sum_{i=1}^{x}sum_{j=1}^{x} [gcd(i,j)=1] = sum_{d=1}^{x} mu(d)(frac{x}{d})^2)

(f(x))可以按照(frac{x}{d})分类,使用跳跳狗来分块计算,复杂度(O(sqrt x)),原式 = (sum_{g=1}^{n} g*f(frac{n}{g})),按照(frac{n}{g})的值使用跳跳狗分块计算即可。

栗子2: 2018沈阳网络赛C

做法:

式子可化为(sum_{i=1}^{n}sum_{j=1}^{i} j^2mu(j)^2 = sum_{i=1}^{n}sum_{j=1}^{i}j^2sum_{d^2|j}mu(d))

交换求和顺序,枚举d,式子可化为(sum_{d=1}^{sqrt n}sum_{j=1}^{frac{n}{d^2}}(n-d^2j+1)(d^2j)^2)

难看死了,整理一下(sum_{d=1}^{sqrt n}[((n+1)d^4sum_{j=1}^{frac{n}{d^2}}j^2)-(d^6sum_{j=1}^{frac{n}{d^2}}j^3)])

中括号里的那个吓死人的东西,其实可以(O(1))计算哎!于是我们就施展开了。

然后注意一下:

  • 首先这个题要用快速乘!
  • 然后(frac{x}{y}\%p = frac{x\%(yp)}{y}) [很好推的啦!]

栗子3: SDOI2015约数个数和

我们要求(sum_{i=1}^{n}sum_{j=1}^{m}d(ij))

按公因子分类,化为(sum_{g=1}^{n}d(g)sum_{i=1}^{n/g}sum_{j=1}^{m/g} d(i)d(j)[gcd(i,j)=1])

对着(sum_{i=1}^{n/g}sum_{j=1}^{m/g} d(i)d(j)[gcd(i,j)=1])施展莫比乌斯反演可转化为一个辣鸡,所以这条路GG了。

真做法:

考虑如下这个式子,(d(ij)=sum_{u|i}sum_{v|j}[gcd(u,v)=1])

为什么成立呢?我们考虑质因子(p)(i,j)中的指数。设(p)(i)中出现(a_1)次,在(j)中出现(a_2)次,那么(p)(i*j)的因子中就会有(a_1+a_2+1)种选择。然后我们考虑等式右边,当(gcd(u,v)=1),设(u)(p)的指数为(b_1)(v)(p)的指数为(b_2),那么(b_1=0)或者(b_2=0), 合法的有序对((b_1,b_2))共有(a_1+a_2+1)个。然后,每种质因子相互独立。所以等式是成立的。

然后这个问题就简单了。不妨设(n<m)

原式 = (sum_{i=1}^{n}sum_{j=1}^{m}sum_{u|i}sum_{v|j} [gcd(u,v)=1])

交换求和顺序得 (sum_{u=1}^{n}sum_{v=1}^{m} [frac{n}{u}] [frac{m}{v}] [gcd(u,v)=1])

施展莫比乌斯反演得(sum_{d=1}^{n} mu(d) sum_{i=1}^{n/d}sum_{j=1}^{m/d}frac{n/d}{i}frac{m/d}{j} = sum_{d=1}^{n} mu(d) (sum_{i=1}^{n/d}frac{n/d}{i})(sum_{j=1}^{m/d}frac{m/d}{j}))

施展跳跳狗分块,即可。

栗子4: ZOJ3881

做法:

  • 先观察到(f(x))是积性函数,然后(g(n)=sum_{d|n}f(d))也是积性函数。
  • (g(n)=(p_1^{a_1}+1)(p_2^{a_2}+1)(p_3^{a_3}+1).....) 【喵】
  • 展开(g(n))我们可以发现,(g(n)=sum_{d|n} d[gcd(d,n/d)=1])
  • (sum_{i=1}^{n} g(i) = sum_{i=1}^{n}sum_{d|i}d[gcd(d,i/d)=1])
  • 按照(gcd(d,n/d))的值,进行容斥有(sum_{g=1}^{sqrt n}mu(g)sum_{i=1}^{n/g^2}i*[frac{n/g^2}{i}])
  • 跳跳狗分块即可。复杂度(O(sqrt nlog(sqrt n)))

【喵】:这个地方,还是打表来得舒适。接下来我们来推一推。

  • 考虑质数(p),(g(p)=p+1),(g(p^k)=p^k+1)
  • 根据积性函数的性质,证完了。【积性函数太好用了!】【口胡.jpg】

姿势2:杜教筛

原文地址:https://www.cnblogs.com/RUSH-D-CAT/p/9634568.html