P3327 [SDOI2015] 约数个数和

需要莫比乌斯函数知识,主要是推式子。挺难的,但不多。 

对了以后的数学题不放代码,除非是知识点讲解,或者算法模板。

因为总有几个烧饼喜欢复制代码刷AC率

 这题的难点就是这个约数个数函数。因此,我先给出这个函数的一个重要性质:

d(ij)=\sum_{x\mid i}^{}\sum_{y\mid j }^{}[gcd(x,y)=1]

至于证明。。。。。我不会。。。。。

知道式子后就可以“愉快”的推式子了!

首先我们很套路的设几个函数,(若不知道为什么那么设的话。。。反正你看就对了)

f(d)=\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)=d]

F(n)=\sum_{n\mid d}^{}f(d)

由莫比乌斯反演可以得到:

f(n)=\sum_{n\mid d}^{}\mu(\left \lfloor \frac{d}{n} \right \rfloor)F(d)

我们设ans为求和最终值;

ans=\sum_{i=1}^{n}\sum_{j=1}^{m}d(ij)

ans=\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{x\mid i}^{}\sum_{y\mid j}^{}[gcd(x,y)=1]

看到这个[gcd(x,y)=1],我们就可以根据μ的性质把它带进去.

ans=\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{x\mid i}^{}\sum_{y\mid j}^{}\sum_{d\mid gcd(x,y)}^{}\mu (d)

更换枚举项,由枚举gcd(x,y)的约数,改为直接枚举d.

ans=\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{x\mid i}^{}\sum_{y\mid j}^{}\sum_{d=1}^{min(n,m)}\mu (d)[d\mid gcd(x,y)]

\mu (d)提出来:(因为它与i,j无关)

ans=\sum_{d=1}^{min(n,m)}\mu (d)\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{x\mid i}^{}\sum_{y\mid j}^{}[d\mid gcd(x,y)]

我们再一次更换枚举项,将枚举x,y换为枚举dx,dy。这样[d∣gcd(x,y)]这个条件就可以省去。

ans=\sum_{d=1}^{min(n,m)}\mu (d)\sum_{x=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum_{y=1}^{\left \lfloor \frac{m}{d} \right \rfloor}\left \lfloor \frac{n}{dx} \right \rfloor\left \lfloor \frac{m}{dy} \right \rfloor

我们可以发现\left \lfloor \frac{n}{dx} \right \rfloor与y无关,所以可以提前。

ans=\sum_{d=1}^{min(n,m)}\mu (d)(\sum_{x=1}^{\left \lfloor \frac{n}{d} \right \rfloor})(\sum_{y=1}^{\left \lfloor \frac{m}{d} \right \rfloor})

当我们将式子化简成这样的时候,我们已经可以看出,这个式子已经可以做到O(n)计算了。

但是,由于存在多组数据,所以我们就可以运用整除分块,将这个式子优化成O(sqrt(n))的时间复杂度。

这样,这道题就可以A了。!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

还是非常有成就感的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值