P3612 [USACO17JAN] Secret Cow Code S【普及】

[USACO17JAN] Secret Cow Code S

题面翻译

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

给定一个字符串,对字符串进行一次操作(每一次正确的操作,最后一个字符都会成为新的第一个字符),然后把操作后的字符串放到操作前的字符串的后面。也就是说,给定一个初始字符串,之后的每一步都会增加当前字符串的长度。

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

第一行输入一个字符串。该字符串包含最多 30 30 30 个大写字母,数据保证 N ≤ 1 0 18 N \leq 10^{18} N1018

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

请输出从初始字符串生成的无限字符串中的下标为 N N N 的字符。第一个字符的下标是 N = 1 N=1 N=1

感谢 @y_z_h 的翻译

题目描述

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 s s s, let F ( s ) F(s) F(s) be s s s followed by s s s “rotated” one character to the right (in a right rotation, the last character of s s s rotates around and becomes the new first character). Given an initial string s s s, the cows build their infinite-length code string by repeatedly applying F F F; each step therefore doubles the length of the current string.

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

输入格式

The input consists of a single line containing a string followed by N N N. The string consists of at most 30 uppercase characters, and N ≤ 1 0 18 N \leq 10^{18} N1018.

Note that N N N 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 N N Nth character of the infinite code built from the initial string. The first character is N = 1 N=1 N=1.

样例 #1

样例输入 #1

COW 8

样例输出 #1

C

提示

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

COW -> COWWCO -> COWWCOOCOWWC

12345678

问题链接: P3612 [USACO17JAN] Secret Cow Code S
问题分析: 普及问题,不解释。
参考链接: (略)
题记: (略)

AC的C++语言程序如下:

/* P3612 [USACO17JAN] Secret Cow Code S */

#include <iostream>

using namespace std;

int main()
{
    string s;
    long long n, num;
    cin >> s >> n;
    num = s.length();
    while (num < n) {
        long long t = num;
        while (t < n) t *= 2;
        t /= 2;
        n -= t + 1;
        if (n == 0) n = t;
    }
    cout << s[n - 1];
    return 0;
}
  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值