AtCoder Beginner Contest 239

G 就是个最小割板子,但是打比赛时一直以为求最小割方案就是把流满的边当作割边,机房里几个人还同时犯了这个错误,错误的点的数量一样,当时一致认为数据有问题,事实上需要从源点开始跑广搜,找出源点不经过流量为 0 0 0的边所能到达的所有的点记为 S S S集,其余点记为 T T T集,如果有一条边上的两个点所在集合不一样,那这条边就是割边

F 关键是怎么设状态,一开始设 f ( x ) f(x) f(x)表示当前数为 x x x,期望经过几次操作大于 m m m,怎么推都只能推出一个暴力 d p dp dp,事实上如果把状态设为 f ( x ) f(x) f(x)表示从 1 1 1点期望经过几次操作可以大于等于 x x x,可以得到
f ( x ) = 1 n ∑ i = 1 n f ( ⌈ x i ⌉ ) + 1 f(x)=\frac{1}{n}\sum_{i=1}^nf(\lceil\frac{x}{i}\rceil)+1 f(x)=n1i=1nf(ix)+1
f ( x ) = ∑ i = 2 n f ( ⌈ x i ⌉ ) + n n − 1 f(x)=\frac{\sum_{i=2}^nf(\lceil\frac{x}{i}\rceil)+n}{n-1} f(x)=n1i=2nf(ix)+n
然后直接递数论分块 + + +记忆化就可以做到 O ( n 3 4 ) O(n^\frac{3}{4}) O(n43)的时间复杂度,具体证明可以参照杜教筛的证明,提前预处理前 n 2 3 n^\frac{2}{3} n32 f f f值,时间复杂度就可以做到 O ( n 2 3 ) O(n^\frac{2}{3}) O(n32)

你可能感兴趣的:(总结,数论,网络流,算法)