时间安排
8:00~9:00
T1首先可以找到环长然后问题变为求有多少
x
≤
n
,
y
≤
m
,
x
y
≡
0
(
m
o
d
p
)
x\leq n,y\leq m,x^y\equiv 0(mod p)
x≤n,y≤m,xy≡0(modp)
然后就枚举p的因子然后简单容斥一下就行了。
这部分复杂度
O
(
p
2
7
)
O(\sqrt p2^7)
O(p27)不过跑不满
9:00~10:00
刚才的算法瓶颈在于找环长,考虑把转移写成矩阵的形式,那么就是找到 A × B t ≡ C ( m o d p ) A\times B^t\equiv C(mod p) A×Bt≡C(modp)的最小的t,可以用BSGS,不过由于A,C的特殊性,不需要求逆。希望能过
10:00~10:30
一开始用map存矩阵,慢的离谱,后来改成hash表,就快的起飞,不过空间似乎有点高,因为这个hash表存的是矩阵。
10:30~11:10
T2一眼有一个nmlogmlogn的做法,可以用01BFS去掉一个log,就能有60分了,写得很顺利。
11:10~11:30
T3完全没思路,只写了20pts暴力。
12:00~12:30
发现T2有个地方写错了,赶紧改。
考后总结
T1
虽然我的T1的做法也能过,不过出题人的更优秀。
首先不需要矩阵BSGS,可以直接根据同余式展开然后枚举
φ
(
9
p
)
\varphi(9p)
φ(9p)的因子,判断是不是环长。
其次,正解通过把y除了过来,让y的上界非常小,当y大于上界的时候,复合的x的个数是不会变得。
因此是log的。感觉自己做题的时候,不太喜欢推式子,总是用一些更加套路或者无脑的东西,比如BSGS或者容斥。
还是要多写一写,必要的时候可以简化运算。
T2
考试的时候想到了重构树,但是不知道怎么判断两个区间是否可达,题解的线段树合并非常妙,维护一个区间内可以到达的点,其余的部分就是60分的二分。
T3
第一步转化就没想到,一直在想dp/拉插,结果是个组合数。
其次,这种根据模数很小把组合数转化到Lucas上,然后类似于一个P进制的数位dp。
老实说其实之前刚做过一道类似的题[清华集训2016] 组合数问题,但是比这个题简单的多,也不需要考虑退位什么的。