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))
  • 相关阅读:
    通过HttpListener实现简单的Http服务
    WCF心跳判断服务端及客户端是否掉线并实现重连接
    NHibernate初学六之关联多对多关系
    NHibernate初学五之关联一对多关系
    EXTJS 4.2 资料 跨域的问题
    EXTJS 4.2 资料 控件之Grid 那些事
    EXTJS 3.0 资料 控件之 GridPanel属性与方法大全
    EXTJS 3.0 资料 控件之 Toolbar 两行的用法
    EXTJS 3.0 资料 控件之 combo 用法
    EXTJS 4.2 资料 控件之 Store 用法
  • 原文地址:https://www.cnblogs.com/Soulist/p/14367668.html
Copyright © 2011-2022 走看看