题目描述

奶牛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 <= 10^9),问第N个字符是字母‘m’还是‘o’?

输入输出格式

输入格式:

一个整数N。

输出格式:

一个字符,m或者o

输入输出样例

输入样例#1: 复制

11
输出样例#1: 复制

m

说明

样例解释:

由题目所知:字符串S(0)是moo, 现在要求第11个字符,显然字符串S(0)不够长;

同样S(1)的长度是10,也不够长;S(2)的长度是25,够长了,S(2)的第11个字符是m,所以答案就输出m。

思路:分治。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int l,r,mid;
int f[];
void dfs(int k){
if(k==){
if(n==) cout<<"m";
else cout<<"o";
return ;
}
else if(n>f[k-]&&n<=f[k-]+k+){
if(n==f[k-]+) cout<<"m";
else cout<<"o";
return ;
}
else if(n<=f[k-]) dfs(k-);
else if(n>f[k-]+k+){
n-=f[k-]+k+;
dfs(k-);
}
}
int main(){
scanf("%d",&n);
f[]=;
for(int i=;i<=;i++){
f[i]=f[i-]+f[i-]++i;
if(f[i]>n){
dfs(i);
break;
}
}
}

最新文章

  1. Form 引用方法库
  2. mysql 导出批量导出表数据 (程序)
  3. Spring的依赖注入怎么理解
  4. 第十八周个人作业--The Final
  5. CF 676B Pyramid of Glasses[模拟]
  6. sprint3冲刺第二天
  7. usb驱动开发8之配置描述符
  8. 去掉DataTable中重复的行
  9. Matlab多个Figure图合成一个Fig
  10. Hibernate理论
  11. Lombok 安装
  12. hibernate java.sql.SQLException
  13. 基于python的知乎开源爬虫 zhihu_oauth使用介绍
  14. CUDA学习,第一个kernel函数及代码讲解
  15. ImageMagick 使用经验
  16. 在CMD命令下安装nexus报错和启动的问题
  17. Analysis Services(SSAS) 性能优化
  18. java SPI &amp; spring factories
  19. VMware与Centos系统安装、重置root密码
  20. Individual P1: Summary

热门文章

  1. Effective C++ 条款12
  2. 威胁报告:mDNS 反射式 DDoS 攻击
  3. Kafka框架基础
  4. AngularJS 导航栏动态添加.active
  5. 【转载】eclipse中批量修改Java类文件中引入的package包路径
  6. 射击的乐趣:WIN32诠释打飞机游戏
  7. 《剑指offer》旋转数组的最小数字
  8. UVa 1599 Ideal Path【BFS】
  9. echarts 总结:
  10. webpack(构建一个前端项目)详解--升级