题目描述

The cows are experimenting with secret codes, and have devised a method for creating an infinite-length string to be used as part of one of their codes.

Given a string ss, let F(s)F(s) be ss followed by ss "rotated" one character to the right (in a right rotation, the last character of ss rotates around and becomes the new first character). Given an initial string ss, the cows build their infinite-length code string by repeatedly applying FF; each step therefore doubles the length of the current string.

Given the initial string and an index NN, please help the cows compute the character at the NNth position within the infinite code string.

输入格式

The input consists of a single line containing a string followed by NN. The string consists of at most 30 uppercase characters, and N≤1018N≤1018.

Note that NN may be too large to fit into a standard 32-bit integer, so you may want to use a 64-bit integer type (e.g., a "long long" in C/C++).

输出格式

Please output the NNth character of the infinite code built from the initial string. The first character is N=1N=1.

题意翻译

奶牛正在试验秘密代码,并设计了一种方法来创建一个无限长的字符串作为其代码的一部分使用。

给定一个字符串,让后面的字符旋转一次(每一次正确的旋转,最后一个字符都会成为新的第一个字符)。也就是说,给定一个初始字符串,之后的每一步都会增加当前字符串的长度。

给定初始字符串和索引,请帮助奶牛计算无限字符串中位置 NN 的字符。

第一行输入一个字符串。该字符串包含最多 3030 个大写字母,数据保证 N≤1018N≤1018 。

第二行输入 NN。请注意,数据可能很大,放进一个标准的 3232 位整数可能不够,所以你可能要使用一个 6464 位的整数类型(例如,在 C/C++ 中是 long long)。

请输出从初始字符串生成的无限字符串中的位置的字符。第一个字符是 N=1N=1.。

感谢@y_z_h 的翻译

输入输出样例

输入 #1复制

COW 8

输出 #1复制

C

说明/提示

In this example, the initial string COW expands as follows:

COW -> COWWCO -> COWWCOOCOWWC

12345678

首先分析数据范围n的范围是1e18 所以模拟题中的过程是不行会超时,然后我们知道这段字符串是如何复制而来的,所以可以采取倒推的方法,从当前n处的位置,推出n在进行复制之前的位置,n的位置共有两种情况,因为复制是先把最后的元素复制再把前面的元素复制下来。由此我们便可以通过递归的方式把n对应到题中所给的字符串的位置。

第一步:先确定n所在位置,按题中所给的方式得到的字符串的长度。

第二步:推位置对应的公式,我们不妨设n在复制之前的位置为k。当n 是第一个元素时,这时k+1 = n, k == l/2;当 n 不是最后一个元素时, 这时 k + l /2 + 1 = n;

第三步:递归,每次缩短一半的长度,然后每次更新 字符的位置,直到当前字符的位置在最初题中所给字符的长度之内。

#include <iostream>
using namespace std;
typedef long long LL;
LL n; int main() {
string str = " ";
cin >> str >> n;
LL l = str.length();
LL num = l;
while(l < n) l *= 2;
l /= 2;
while(n > num ) {
if( n - l > 1) n -= (l + 1);
else if(n == l + 1) n = l;
l /= 2;
}
cout << str[n - 1];
return 0;
}

洛谷P3612(递归)的更多相关文章

  1. 如何求先序排列和后序排列——hihocoder1049+洛谷1030+HDU1710+POJ2255+UVA548【二叉树递归搜索】

    [已知先序.中序求后序排列]--字符串类型 #1049 : 后序遍历 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho在这一周遇到的问题便是:给出一棵二叉树的前序和 ...

  2. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  3. 洛谷P1198 [JSOI2008]最大数

    P1198 [JSOI2008]最大数 267通过 1.2K提交 题目提供者该用户不存在 标签线段树各省省选 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 WA80的戳这QwQ BZOJ都 ...

  4. 洛谷P1157 组合的输出

    洛谷1157 组合的输出 题目描述 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r<=n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数. ...

  5. 洛谷 P3927 Factorial

    题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. SOL菌表示不服,立刻就要算这个数在k进制表示下末尾0的个数. 但是SOL菌太菜了于是请 ...

  6. 洛谷P3369 【模板】普通平衡树(Treap/SBT)

    洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...

  7. 树链剖分详解(洛谷模板 P3384)

    洛谷·[模板]树链剖分 写在前面 首先,在学树链剖分之前最好先把 LCA.树形DP.DFS序 这三个知识点学了 emm还有必备的 链式前向星.线段树 也要先学了. 如果这三个知识点没掌握好的话,树链剖 ...

  8. 【数论】卢卡斯定理模板 洛谷P3807

    [数论]卢卡斯定理模板 洛谷P3807 >>>>题目 [题目] https://www.luogu.org/problemnew/show/P3807 [输入格式] 第一行一个 ...

  9. 【洛谷P3369】【模板】普通平衡树题解

    [洛谷P3369][模板]普通平衡树题解 题目链接 题意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3 ...

  10. 洛谷P4891 序列(势能线段树)

    洛谷题目传送门 闲话 考场上一眼看出这是个毒瘤线段树准备杠题,发现实在太难调了,被各路神犇虐哭qwq 考后看到各种优雅的暴力AC......宝宝心里苦qwq 思路分析 题面里面是一堆乱七八糟的限制和性 ...

随机推荐

  1. 「学习笔记」KMP 算法

    前置知识 前缀 是指从串首开始到某个位置 \(i\) 结束的一个特殊子串. 真前缀 指除了 \(S\) 本身的 \(S\) 的前缀. 举例来说, 字符串 abcabeda 的所有前缀为 {a, ab, ...

  2. requests高级用法、代理池搭建

    requests高级用法 1.自动携带cookie的session对象 # session对象---->已经模拟登录上了一些网站--->单独把cookie 取出来 import reque ...

  3. 当cmd运行python无法显示中文报错 SyntaxError: Non-UTF-8 code starting with 时

    报错图片: 解决方法: 在python的脚本开头加上 再运行后

  4. 在VS Code 中调试远程服务器的PHP代码

    背景 对于PHP的调试,一般来说我们用 echo 和 var_dump 就够用了. 有时会碰到要解决复杂的逻辑或需要确认代码的运行顺序,这里用var_dump效率就比较低了,这时建议用断点的方式进行代 ...

  5. Hexo博客yilia主题添加背景音乐 (网易云音乐)

    1. 打开网易云音乐首页,然后搜索你要添加的背景音乐 http://music.163.com/ 2. 搜索到歌曲点击生成外链播放器,进去下一个界面 3. 复制外链播放器的代码 打开yilia主题下的 ...

  6. Redis的设计与实现(1)-SDS简单动态字符串

    现在在高铁上, 赶着春节回家过年, 无座站票, 电脑只能放行李架上, 面对着行李架撸键盘--看过<Redis的设计与实现>这本书, 突然想起, 便整理下SDS的内容, 相对后面的章节, 算 ...

  7. Oracle随机生成大数据

    Oracle随机插入大数据 话不多说,安排 示例: -- 创建新表并批量插入五千万数据 create table TEST_TAB as select rownum as id, to_char(sy ...

  8. C# Task 实现任务超时取消、超时取消然后重试 超过重试最大次数就结束。

    任务超时取消 示例 public static async Task TimeoutCancelTask() { CancellationTokenSource cts = new Cancellat ...

  9. virt-install 使用 qcow2格式虚拟机镜 、macvtap网卡

    安装虚拟机 这里使用 amazn2 虚拟机镜像安装,根据官网文档,需要预先配置一个 seed.iso 文件 参考文档:https://docs.aws.amazon.com/zh_cn/AWSEC2/ ...

  10. Linux 命令:rpm查询选项

    rpm(8) System Manager's Manual rpm(8) 名称 rpm - RPM 软件包管理器 查询选项 rpm的查询命令通常的格式如下: rpm -q [query-option ...