A.注意到∀n>m,n! mod m=0,又有10!=3628800>106,故对于n≥10,(n!)! mod m=0.
然后预处理所有的1≤x<m,x! mod m的值。每次对于小于10的n,暴力计算n!的值,并查表得到(n!)! mod m的值。
B.注意到对于排列P,若P1=1,则必有P的前缀最小值变化次数(f(P))等于1。所以当P1=1时,取Q1=1,则也有Q1′=1,此时max(f(Q),f(Q′))=1,显然取到最小值。
在P1=1时,Q1和Q1′必有一个不为1,则答案至少为2(因为第一个位置和1所在的位置必然产生贡献),考虑构造答案为2的Q。不妨令Q1′=1,则有f(Q′)=1,此时QP1=1已经决定,其余未决定。则令Q1=2,那么f(Q)必然为2。剩余的位置可以随便填。
C.分k≤n和k>n考虑。
k≤n时,可以直接暴力计算答案,复杂度为∑logkn,不超过nlog(n).
k>n时,注意到此时转换过去的数必为2位数,且低位为n mod k=n−k∗⌊kn⌋,高位为⌊kn⌋,此时k2=1+max(n−k∗⌊kn⌋,⌊kn⌋)。考虑进行整除分块。不妨设x=⌊kn⌋,考虑x所有对应的k:
n−k⌊kn⌋≥⌊kn⌋⟺n≥(k+1)⌊kn⌋⟺k+1n≥⌊kn⌋⟺⌊k+1n⌋=⌊kn⌋
(最后一步可以脑补一下数轴)
由此,对于一个固定的x和k∈[l,r],仅有端点r处选择k2=⌊kn⌋,接下来就可以很快乐的整除分块了。
D.D<C早就被猜到了,但是D过的比B多还是有点出乎意料…
对于一对(i,j),进行一次操作等价于把所有的二进制位的1都尽量向j位置靠拢。形式化地,对于某个二进制位x,令ix,jx表示i,j位置上的数的该位的值,则若ix,jx中有两个1或者零个1,执行操作后不变,否则变为ix=0,jx=1。
对于总体来说,也是一样的。每个二进制位将所有的1尽量向后靠拢。形式化地,假设某个二进制位共有p个1,则后p个数在该位为1,前n−p个数在该位为0。
E.读完就会做的题。本来这题时限3s,m=2e5,k=10,哪怕在这种情况下std也是能跑过的,结果放宽限制发现大家还是被卡常数了,难受。
不妨令Pu表示L在u的子树内的概率,令Su表示u子树内所有节点的pu的和。不难发现这件事等价于所有的选择的点全部在u的子树内,所以Pu=(S1Su)k。
令Ansu代表L恰好为u的概率,则Ansu=Pu−∑Pv=S1kSuk−∑Svk,其中v是u的儿子们。最终的期望为∑u∗Ansu。
由于可以把S1k留在最后统一除,所以先抛掉这部分。考虑每个Suk的贡献,不难发现它在u处的贡献为u∗Suk,而在fu处的贡献为−fu∗Suk,其中fu为u的父亲,在其余各点处没有贡献。所以最后答案等于∑(u−fu)∗Suk。注意到u−fu是个常数,而每次更新只会更新该节点到根上的所有点的Su,故直接采用树剖线段树维护。线段树维护区间u−fu乘以Su的0次至k次幂的和,每次打标记时通过组合数转移即可。时间复杂度O(mk2log2(n)),虽然看起来很大,但是跑起来很快。
本题还可以离线询问,线段树合并做到mk2log(n)(口胡的,没写过)
Bonus:你能做的更快吗?
F.假设枚举最小值M,则对应的EGF是(∑i=0k−1i!xi)M−1×(∑i=0ni!xi)m−M×(∑i=kni!xi),所求答案为该EGF的xn项系数乘以mnn!。
不妨令A(x)=∑i=0k−1i!xi , B(x)=(∑i=0ni!xi),C(x)=∑i=kni!xi,则答案等于nmn!×[xn]∑M=1mC(x)×A(x)M−1×B(x)m−M×M,而后面那个多项式等于
C(x)(A(x)−B(x))2mA(x)m+1−B(x)(m+1)A(x)m+B(x)m+1,注意到C(x)=B(x)−A(x),则上式等于C(x)mA(x)m+1−B(x)(m+1)A(x)m+B(x)m+1,然后可以使用任意你喜欢的多项式技巧去计算这个式子了。这题时限似乎不紧吧。