字符串操作
描述
奶牛Bessie近在学习字符串操作,它用如下的规则逐一的构造出新的字符串:
S(0)= moo
S(1) =S(0)+ m + ooo + S(0) = moo + m + ooo + moo = moomooomoo
S(2) =S(1)+ m + oooo + S(1) = moomooomoo + m + oooo + moomooomoo =moomooomoomoooomoomooomoo
…
Bessie就这样产生字符串,直到最后产生的那个字符串长度不小于读入的整数N才停止。
通过上面观察,可以发现第k个字符串是由:第k−1个字符串+m+(k+2个o)+第k−1个字符串连接起来的。
现在的问题是:给出一个整数N(1≤N≤109),问第N个字符是字母m还是o?
输入
一个正整数N。
输出
一个字符,m或者o。
输入样例 1
11
输出样例 1
m
代码(可直接复制):
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int l,r,mid;
int f[50];
void dfs(int k){
if(k==0){
if(n==1) cout<<"m";
else cout<<"o";
return ;
}
else if(n>f[k-1]&&n<=f[k-1]+k+3){
if(n==f[k-1]+1) cout<<"m";
else cout<<"o";
return ;
}
else if(n<=f[k-1]) dfs(k-1);
else if(n>f[k-1]+k+3){
n-=f[k-1]+k+3;
dfs(k-1);
}
}
int main(){
scanf("%d",&n);
f[0]=3;
for(int i=1;i<=27;i++){
f[i]=f[i-1]+f[i-1]+3+i;
if(f[i]>n){
dfs(i);
break;
}
}
}