A
做法很简单直接维护单调队列,找到每个元素的前一个和后一个大于他的即可
考场上写了O(n)O(1)rmq
B
我会推式子!(下文用 (i,j) 代表 gcd(i,j),用 [i,j] 代表 lcm(i,j),默认 n≤m,除法下取整)
i=1∏nj=1∏m[i,j][i,j]=i=1∏nj=1∏m((i,j)ij)(i,j)ij=g=1∏ni=1∏nj=1∏m(g2ij×g)g2ij×g×ϵ((i,j)=g)
令 i=i/g,j=j/g,变为枚举 i,j 是 g 的多少倍,再化掉元函数:
=g=1∏ni=1∏n/gj=1∏m/g(ijg)(ijg)ϵ((i,j)=1)=g=1∏ni=1∏n/gj=1∏m/g(ijg)(ijg)∑k∣(i,j)μ(k)=g=1∏ni=1∏n/gj=1∏m/gk∣(i,j)∏(ijg)(ijg)μ(k)
注意说这个西格玛可以放下去
令现在的 i=i/k,j=j/k
=g=1∏nk=1∏n/gi=1∏n/gkj=1∏m/gk(ijgk2)(ijgk2)μ(k)=g=1∏nk=1∏n/g(i=1∏n/gkj=1∏m/gk(ij)(ij))gk2μ(k)×g=1∏nk=1∏n/g(gk2)μ(k)gk2×∑i=1n/gk∑j=1m/gkij
是不是有些端倪了……我们令 f(n,m)=∏i=1n∏j=1m(ij)ij,S(n)=∑i=1ni ,再令 T=gk 枚举
左半边=g=1∏nk=1∏n/gf(n/gk,m/gk)gk2μ(k)=T=1∏nf(n/T,m/T)∑k∣Tk2μ(k)kT=T=1∏nf(n/T,m/T)T∑k∣Tkμ(k)
右半边=g=1∏nk=1∏n/g(k2)gk2μ(k)S(n/gk)S(m/gk)×g=1∏nk=1∏n/g(gg)k2μ(k)S(n/gk)S(m/gk)=T=1∏nk∣T∏((k)T2kμ(k))S(n/T)S(m/T)×T=1∏nk∣T∏((kT)Tkμ(k))S(n/T)S(m/T)=T=1∏nk∣T∏(kTkμ(k))S(n/T)S(m/T)×T=1∏nk∣T∏(TTkμ(k))S(n/T)S(m/T)
令 L(T)=T∑k∣Tkμ(k),G(T)=∏k∣Tkkμ(k) 其中第二个到第三个是把k乘过去了
左半边=T=1∏nf(n/T,m/T)L(T);右半边=T=1∏n(TL(T)×G(T)T)S(n/T)S(m/T)
f(n,m)=(∏i=1nii)S(m)(∏i=1mii)S(n) ,可通过 O(nlogn) 预处理 ∏i=1nii 再每次查询时做快速幂求得。
L,G 都可以 O(nlnn) 枚举约数算得,然后再处理 TL(T),L(T)T 的前缀积和 L(T) 的前缀和,就可以数论分块解决啦。时间复杂度 O(nlogn+Tnlogmod) ,期望得分 100pts
C
询问两个会有m−xi−xj−(i,j),(i,j)表示i,j之间逆序对数
观察有
∑iquery(i,j)=2m+(n−3)xi
然后直接做就好了,有了xi就可以会知道(i,j)是不是逆序对,就能得到i的排名了
但是我们也有一个叫做归并排序的方法,可以在nlogn次逆序对关系得出答案
然后考虑优化,我们可以考虑怎么快速查询i位置的答案
先查询得到x1,xn的取值,这里我们直接查询O(2n−2)
然后可以直接得到每个的信息
询问1,i,n
你会发现
只有1,i为逆序对或者i,n为逆序对,或者1,i,n没有逆序对
两个信息求和有2xi
但是可能因为上述情况出现奇数,我们+1/2即可得到xi
然后我们就有每个xi
调用归并排序,就是类似得到每个位置逆序对,还原原来序列即可