zoukankan      html  css  js  c++  java
  • ZJOI2018 迷宫

    我们简化的题意为:构造一个 (m) 进制下的自动机,使得其可以识别所有 (K) 的倍数。

    我们可以轻易构造一个大小为 (K) 的自动机(按照模 (K) 进行分类)

    我们考虑到部分节点是冗余的,将他们缩起来就可以得到答案。

    换而言之,我们需要缩去这个自动机上所有从 (x) 处出发,到达 (0) 时能够识别的串 (s) 都相同的节点。

    (事实上,可以论证不存在更优的构建方法,因为构造出来的自动机都可以类似的描述)

    假定 (i) 出发到达 (0) 的最短串长为 (f(i)),定义 (g(i)=m^{f(i)}mod K),那么两个节点等价当且仅当 ((f(i),g(i))) 是相同的。

    (f(i)) 等价于 (i imes m^j=0/i imes m^jmod K+m^j>K),可以 (log K) 的计算,此时可以得到 50pts 的高分。

    我们观察到:若令 (d=gcd(m,K)),假定剩余了数字,那么剩余数字必然为 (d) 的倍数,且其是均匀的,将所有数字除以 (d) 都将剩余连续的区间。

    不妨令 (f(L,m,m^j,K)) 表示当前保留的数为 ([1,L]) 执行上述流程留下的数字数。

    • (gcd(m,K)=1),答案为 (L),否则令 (h(i)=immod K),显然 (d|h(i)) 且其模 (frac{K}{d}) 循环。
    • 被删除的个数等价于考虑 (h) 的取值位于 ((K-m^j,K)) 内的数的个数。
    • (L>frac{K}{d}),则 (h(1)sim h(L)) 取遍了所有的 (frac{K}{d}) 的值,剩下的都是 ((0,K-m^j])(d) 的倍数,删掉了 (frac{m^j}{d}) 个数,我们递归到 (f(frac{L-m^j}{d},m,m^jcdot frac{m}{d},K/d))(注意 (m) 处也需要放缩)。
    • 否则显然 (h(1)sim h(L)) 互不相同,在最终的递归中这些数字都将被删除,于是最后删除 (L) 个数。
    • 特别注意需要需要特判 (K<m) 的时候,此时返回 (min(L,K/d))
    • 复杂度 (mathcal O(Tcdot log^2 n))
  • 相关阅读:
    JavaScript操作符instanceof揭秘
    Linux打开txt文件乱码的解决方法
    Working copy locked run svn cleanup not work
    poj 2299 UltraQuickSort 归并排序求解逆序对
    poj 2312 Battle City 优先队列+bfs 或 记忆化广搜
    poj2352 stars 树状数组
    poj 2286 The Rotation Game 迭代加深
    hdu 1800 Flying to the Mars
    poj 3038 Children of the Candy Corn bfs dfs
    hdu 1983 Kaitou Kid The Phantom Thief (2) DFS + BFS
  • 原文地址:https://www.cnblogs.com/Soulist/p/14367668.html
Copyright © 2011-2022 走看看