ZJNU 1900 Secret Cow Code 想法題 倒推

Secret Cow Code

Time Limit: 3000MS Memory Limit: 3000K
Total Submissions: 65 Accepted: 18
Description

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

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

Input

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

Note that 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++).

Output

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

Sample Input

COW 8
Sample Output

C
Hint

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

COW -> COWWCO -> COWWCOOCOWWC

題目鏈接

題意:給你一個字符串,這個字符串每次都會增加,增加的方法爲從最後一個開始正向讀,讀完整個字符串並且增加到原來字符串的後面,問你增加後的第n個字符是什麼。

解題思路:對於一個在字符串s的x位置(x!=strlen(s)即不爲最後一個)上的字符,增加一次後,他的位置將會變成x+strlen(s)+1,若爲最後一個則爲strlen(s)+1,因此我們可以進行倒推,根據正推公式我們可以得出,在n位置上的字符,上一個位置應該爲n-strlen(st)-1,st爲增加多次後比n小的最長的字符串,當然如果爲0,即爲那次中讀的第一個,因此若爲0,將其改爲strlen(st)即可,最後當n小於等於strlen(s)的時候,我們即可得出答案。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll mm=1e18;
char s[35];
ll n,a[100],pl;
int main(){
    scanf("%s%lld",s,&n);
    ll l=strlen(s);
    a[1]=l;
    for(ll i=2;;i++){
        a[i]=a[i-1]*2;
        if(a[i]>n){
            pl=i;
            break;
        }
    }
    while(1){
        if(n<=l){
            break;
        }
        ll p=lower_bound(a,a+pl,n)-a-1;
        n=n-a[p]-1;
        if(n==0)    n=a[p];
    }
    printf("%c\n",s[n-1]);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章