Hack 说明

在今天的模拟赛中,部分同学由于对出现某个数在模 1000000007 意义下为 0 的情况不规范被 Hack。
Hack 原理:开始时有 21,先都加到 1000000001,然后一个一个加 8虽然加 7 次足以 Hack,这个时候如果对 1000000007 处理不好,可能后面都变成 0
我的方案:考虑两个性质(按照题解):

  1. 2 操作到 1000000007 的倍数(分子为 0)只可能是 1000000007,也就是说每个位置至多出现一次分子或分母为 0
  2. 分母为 0 的上一步同样位置的 2 操作中一定分子为 0,因为分母为 0 时必定出过 ai=1000000007。(我可能给之前的同学解释错了,因为可能出现 3 操作使得分子分母为 02 操作之间夹着几个,但也无伤大雅,这里致以诚挚歉意)。

综上所述,考虑记录每个位置上一次的分子为 0 位置,维护一个指针指向当前更新到的点。遇到分子为 0 的值,停止维护,输出答案一定为 0。遇到分母为 0,找到对应分子为 0 的位置,合并两个分数:将后者的分子赋给前者,后者置为 1,这样保证后面的值都是对的。指针继续往下跳转,直到遇到下一个分子为 0 的数。
以 Hack 数据为例,最后几个数为 01000000006,01000000006,10,10,位置分别在 1,2,1,2,扫到第一、二个数停止更新,输出 0。扫到第三个数,将第一个数变成 11000000006,第三个数变为 1,往下更新到第二个数处。扫到第四个数,同理更新,此时可以更新到第四个数。
upd:好像还把精度卡了,PEP 1015 的 eps 没过....我的代码用的分数类。
附:数据,我的代码

本文作者:Pursuing-OIer

本文链接:https://www.cnblogs.com/blog21012004/p/18561428

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Pursuing_OIer  阅读(198)  评论(28编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起