最后一天了。
water
唯一的签到题,直接按出现次数从小到大排序一下贪心求就行了。
circle
一个数想要成为逆序对,它等后面的数选了它不选,那么对于后面的一个数情况可能是我不选,它选了,或是我不选,它不选,我不选,它选,这样无限循环下去,那么第 n n n 次循环其实有 2 n − 1 2n-1 2n−1 不选的概率。那么可以看成一个首项为 p ( 1 − p ) p(1-p) p(1−p) 公比是 ( 1 − p ) 2 (1-p)^2 (1−p)2 的等比数列,这个东西有无限项,但它的公比小于 1 1 1 是可以收敛的。假设你的首项为 a a a 公比为 q q q 那么在 q < 1 q<1 q<1 的情况下,无限项的求和公式为
S = 1 1 − q S = \frac{1}{1-q} S=1−q1
那么这个可以逆元套上去,那么考虑一个数 i i i 后面是有 n − i n - i n−i 个数的,那么每个数都可以和它构成逆序对,那么这个数组成逆序对的期望是 ( n − i ) × S (n-i) \times S (n−i)×S,那么你再加法原理加起来,不能暴力加,这其实是 ( n − 1 ) ( n − 1 + 1 ) 2 \frac{(n-1)(n-1+1)}{2} 2(n−1)(n−1+1) 的,乘上去摸一下然后开个 ull 就可以了。
int a1 = (y - x) * ksm(y, p - 2, p) % p * x % p * ksm(y, p - 2, p) % p;
int q = (y - x) * ksm(y, p - 2, p) % p * (y - x) % p * ksm(y, p - 2, p) % p;
int ans = ((n - 1) * n % p - n * (n - 1) % p * ksm(2, p - 2, p) % p + p) % p * a1 % p * ksm(1 - q + p, p - 2, p) % p;
path
第二难的套路题吧。这个
k
k
k 比较小,还是 DAG,直接想到下降幂 dp。
x n = ∑ k = 0 n { n k } × ( x k ) × P k x^{n}=\sum_{k=0}^{n} \begin{Bmatrix}n\\k\end{Bmatrix} \times {{x \choose k} \times P_k} xn=k=0∑n{nk}×(kx)×Pk
那就老套路了,斯特林数和排列单独拿出来处理,余下的式子考虑它的组合意义,就是从路径上的点选出一些点的方案数,那么直接 DAG dp。转移你就考虑当前这个点选还是不选复杂度 O ( n k ) O(nk) O(nk)。
point
什么西伯利亚啊。