洛谷 P3612 [USACO17JAN] Secret Cow Code S 题解

一、题意概括

我们现在有一个无限的序列,这个序列由无限次翻转构成。每一次翻转将原来的长度为 k 的序列整体向后移动一位,并将原序列的第 1 个元素移到第 k 个位置,再将这样做得到的新序列拼接在原序列的后面,这样得到一个长度为 2k 的新序列。给定一个正整数 N ,求这个序列的第 N 项是什么字母。

二、思路分析

1. 分析数据范围,确定使用方法

  由于 N \le 10^{18} ,所以我们不能使用时间复杂度高于 O(N) 的算法。故考虑使用 O(\log^kN) ( k 为常数) 时间复杂度的算法来解决这个问题。

2. 分析使用方法,确定算法结构

  (1) 大体框架结构

     通过分析样例,我们可以得知,假设一个元素位于新序列中的第 N 项,原序列的长度为 k ,那么这个元素位于原序列中的第 (N-k-1+k)\mod k=(N-1)\mod k 个位置。所以,我们可以使用模拟这个过程的算法,重复将 N \leftarrow (N-1)\mod k ,这种方法结构的时间复杂度为 O(\log N) 。

  (2)细节优化处理

     上面描述中的 k 可以使用如下方式处理:设置一个值 d ,重复枚举 d ,判断 2^{d-1} \le N 是否成立,若为否,则退出循环。最后的 k=2^{d-1} 。这样,这个过程的时间复杂度为 O(\log N) ,所有算法的时间复杂度为 O(\log^2 N) 。对于 N \le 10^{18} 的数据范围,可以在时间范围内输出答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值