【比赛】【SMOJ 2019.1.24】
三道题两道套路题可还行。
类欧太难,数位\(\mathrm{DP}\)又太难推。自闭。
卡常卡不过去(明明就是\(\Theta(n^2\log n)\)的时间复杂度啊为什么过不去啊啊啊……)
可做题终于出现了。
然而思路越简单的题目貌似坑也越多。
考虑线段树上维护两个标记,分别表示指数的标记和系数的标记。
指数标记的优先级比系数标记的高。
然后在下推标记时先推指数标记再推系数标记即可。
坑点一:区间乘
为区间中的每一个数都乘上一个数\(x\)是要乘\(x^{\texttt{区间长度}}\)的,而不是只乘\(x\)。
坑点二:线段树的节点
每个节点表示的究竟是什么?这个问题值得认真去思考。
毕竟我们维护的不是一个个点,是一条条线段啊。
反正最后用的就是最简单的方法:以线段的端点作为节点再离散化,这样每次操作都相当于修改若干个连续区间,然后区间长度应该是\(r(index)-l(index)\)(不需要\(+1\),因为单位线段的个数要比端点数少\(1\))。
坑点三:如何对指数标记取模?
还好我考场上没来由地想起了逆元这个神奇东西。
我们回顾一下求逆元所需要依靠的费马小定理:
\[a^p \equiv a \pmod p
\]
当\(a\)不是\(p\)的倍数时,上面的式子有一个更常见的变式:
\[a^{p-1} \equiv 1 \pmod p
\]
然后\(a^0=1\)。
所以$$a^{p-1} \equiv a^0 \pmod p$$
\(so?\),指数就相当于关于\(p\)取模了嘛。
所以我们在对指数标记取模时把模数设成\(m-1\)即可。
坑点四:\(0^0=?\)
在初中,\(0^0\)无意义,但在以后我们可以用极限的知识证明:\(0^0=1\)。