OJ2504

题目要求这个式子:

\(\frac{1}{n(n-1)}\sum_{i=1}^n\sum_{j=1}^n\varphi(a_i*a_j)*dist(i,j)\)

其中\(a_i\)\(1\)\(n\)的一个排列

首先一个结论是:

\(\varphi(i*j)=\frac{\varphi(i)*\varphi(j)*gcd(i,j)}{\varphi(gcd(i,j))}\)

按照套路枚举gcd提出来:

\(\sum_{d=1}^n\frac{d}{\varphi(d)}\sum_{i=1}^n\sum_{j=1}^n[gcd(a_i,a_j)==d]\varphi(a_i)\varphi(a_j)*dist(i,j)\)

根据反演的式子:

\(F(d)=\sum_{d|n}f(d)\)

\(f(n)=\sum_{d|n}\mu(d)F(\lfloor\frac{n}{d}\rfloor)\)

于是反演后面的式子:

\(\sum_{d=1}^n\frac{d}{\varphi(d)}\sum_{k=1}^n\mu(k)\sum_{kd|a_i}\sum_{kd|a_j}\varphi(a_i)\varphi(a_j)*dist(i,j)\)

枚举\(kd=T\)

\(\sum_{T=1}^n\sum_{d|T}\frac{d\mu(\frac{T}{d})}{\varphi(d)}\sum_{T|a_i}\sum_{T|a_j}\varphi(a_i)\varphi(a_j)*dist(i,j)\)

对于后面的,把权值为\(T\)的倍数的点提取出来建立虚树跑树形dp。

发现一共\(O(nlogn)\)个点,于是时间复杂度是\(O(nlog^2n)\)

猜你喜欢

转载自www.cnblogs.com/Kylin-xy/p/tijiefzoj2504.html
今日推荐