题目要求这个式子:
(frac{1}{n(n-1)}sum_{i=1}^nsum_{j=1}^nvarphi(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}^nfrac{d}{varphi(d)}sum_{i=1}^nsum_{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(lfloorfrac{n}{d} floor))
于是反演后面的式子:
(sum_{d=1}^nfrac{d}{varphi(d)}sum_{k=1}^nmu(k)sum_{kd|a_i}sum_{kd|a_j}varphi(a_i)varphi(a_j)*dist(i,j))
枚举(kd=T):
(sum_{T=1}^nsum_{d|T}frac{dmu(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))