您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页【纪中集训2019.08.21】【JZOJ6315】数字

【纪中集训2019.08.21】【JZOJ6315】数字

来源:华佗小知识

 

题意:

  设$s(i)$为将$1\sim i$看做字符串后依次连接形成的串。给定正整数$n$,求最小的$i$使得$n$是$s(i)$的字串。$T$组数据。

  $n\le 10^{17}, \; t\le 10^4$

 

分析:

  不能模拟$s(i)$的组成过程来找答案,时间不能承受。

  也不能预处理$s(k)$,空间不能承受。

  那就只能在$n$上找答案。

  以下把数字当成字面量来讨论,更方便。

  同时,这里讨论的前缀和后缀不包括本身。

  思考一下,答案分为三种:

  1.$ans=n$

  2.$n$由$ans$的前缀和$ans-1$的后缀组成

  3.$n$由$ans-k$的后缀和$ans-k+1 , \, ans-k+2 \dots ans-2 , \, ans-1$整串和$ans$的前缀组成

  那么把三类答案的所有可能取最小值即可。

  

  先确定一下我们模拟的工具。用字符串还是数字?

  字符串更方便控制位置,数字在比较、增减的时候更方便。

  我这里用一种取两家之长的做法:

  1.以五倍最大长度($N=17$)存储每一位数字

  2.用头尾指针记录数字的位置,初始化数字首位在$2*N+1$上。非数字位数值为$-1$,比较时视作通配符。

  3.定义左移、右移、找零、判九等函数辅助操作

  个人感觉这个模型的灵活度很高,适用于数字$\times$字符串的操作。

 

  现在看到第二类答案。

  首先枚举“切一刀”的位置,设分离出的数字为$x$和$y$,将$y$从最左边开始向右卡位,尝试匹配。

  边界一:$y$的右侧不能和$x$的右侧平齐。连续的自然数数值是有变化的,如果两个数字的右侧平齐,甚至$y$的右侧越过$x$的右侧,$x$必然不是$ans-1$的后缀。

  边界二:$y$的左侧不能和$x$的左侧平齐。这和我们的定义相违背:$ans$相邻的数字不是$n$的子串。

  注意,这里的“匹配”,有可能有进位。

 

  看到第三类答案。

  首先枚举基准数,再将它的相邻数字往左、右匹配。这里凸显出了数据模型的灵活性。

  基准数不能等于原数。

  数字减少时可能会出现$0$,注意应对。

  注意数字位数的变化,左右移动的距离要根据当前数字的长度来。

 

实现(100分):

 

 

 

小结:

  应对神奇大模拟,优秀的模型往往会有事半功倍的效果。

 

转载于:https://www.cnblogs.com/Hansue/p/11405092.html

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务