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≤
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;
}