题目要求这个式子:
\(\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)\)