Big String


Time Limit: 2 Seconds Memory Limit: 65536 KB

We will construct an infinitely long string from two short strings: A = "^__^" (four characters), and B = "T.T" (three characters). Repeat the following steps:

  • Concatenate A after B to obtain a new string C. For example, if A = "^__^" and B = "T.T", then C = BA = "T.T^__^".
  • Let A = B, B = C -- as the example above A = "T.T", B = "T.T^__^".

Your task is to find out the n-th character of this infinite string.


Input

The input contains multiple test cases, each contains only one integer N (1
<= N <= 2^63 - 1). Proceed to the end of file.


Output

For each test case, print one character on each line, which is the N-th
(index begins with 1) character of this infinite string.


Sample Input

1
2
4
8


Sample Output

T
.
^
T

本题看起来很简单,字符串的组合也很有规律,有的同学就试图研究叠加后的字符串规律。结果发现,叠加后的字符串虽然有规律,但是与输入的数据n之间没有直接的联系。

(1) 如果从字符串的长度考虑:

a=strlen("^__^")   ->a=4

b=strlen("T.T)     ->b=3

c=strlen("T.T^__^) ->c=7

再按照题目给定的步骤重复,我们就很容易发现,这正是以a,b为基数的斐波那契(Fibonacci)数列。

对于输入的正整数n,它对应的字符位于经过若干次按斐波那契数列的规律叠加后的字符串中。无论字符串如何叠加,该位置的字符总是在字符串C中。本题就变成给定一个正整数n,求出小于n的最大斐波那契数,n与该斐波那契数的差正是该字符在另一个更短的字符串C中的位置。

输出时要注意,string类型的字符串的位置是从0开始编号的,所以用这个差值当下标时需要减去1。

(2)算法优化

由于n最大可达2^63-1,对于输入的个n,都去计算小于n的最大斐波那契数,显然是非常浪费时间的。解决的办法是预先把在1到2^63-1范围内的所有斐波那契数求出来,放到一个数组中,经过计算,该斐波那契数列最多为86项,第86项的斐波那契数列最多约是6.02*10^18,而2^63-1约是9.22*10^18。

题意:设A="^__^"(4个字符),B="T,T"(3个字符),然后以AB为基础,构造无限长的字符串。重复规则如下:

(1)把A接在B的后面构成新的字符串C。例如,A="^__^",B="T.T",则C=BA="T.T^__^"。

(2)令A=B,B=C,如上例所示,则A="T.T",B="T.T^__^"。

编程任务:给出此无限长字符串中的第n个字符。

附上代码:

 #include <iostream>
#include <cstdio>
#define len 88
using namespace std;
int main()
{
char base[]="T.T^__^";
//将斐波那契数列在2^63-1范围之内的数全部计算出来
long long int f[len];
f[]=;
f[]=;
for(int i=; i<len; i++)
f[i]=f[i-]+f[i-];
long long int n;
while(~scanf("%lld",&n))
{
//对于每一个n,减去小于n的最大斐波那契数
while(n>)
{
int i=;
while(i<len&&f[i]<n)
i++;
n-=f[i-];
}
//n中剩下的值,就是该字符在base中的位置
printf("%c\n",base[n-]);
}
return ;
}

zoj 1633 Big String的更多相关文章

  1. ZOJ Special AC String 水

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3702 题目大意: 对于给定的一个字符串,满足如下要求输出AC,否则WA(好吧我 ...

  2. ZOJ 1633

    迭代 每个数对应前面的一个数 #include<stdio.h> #include<iostream> using namespace std; #define max 88 ...

  3. [AC自己主动机] zoj Searching the String

    意甲冠军: 到原始字符串.给n字符串,每个字符串都有一个属性,属性0代表重叠,1代表不能重叠 请各多少次出现的字符串 思维: 为了便于建立两台机器自己主动(0一个.1一个) 然后,它可以重叠非常好做, ...

  4. ZOJ 3228 Searching the String(AC自动机)

    Searching the String Time Limit: 7 Seconds      Memory Limit: 129872 KB Little jay really hates to d ...

  5. ZOJ——String Successor(字符串模拟题目)

    ZOJ Problem Set - 3490 String Successor Time Limit: 2 Seconds      Memory Limit: 65536 KB The succes ...

  6. ZOJ 1151 Word Reversal反转单词 (string字符串处理)

    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=151 For each list of words, output a l ...

  7. ZOJ 3490 String Successor

    点我看题目 题意 : 给你一个字符串,让你按照给定规则进行处理. 如果字符串里有字母或者是数字就忽略非字符数字,如果没有,就让最右边的那个字符+1. 增量都是从最右边的字母或者数字开始的. 增加一个数 ...

  8. Searching the String - ZOJ 3228(ac自动机)

    题目大意:首先给你一下母串,长度不超过10^5,然后有 N(10^5) 次查询,每次查询有两种命令,0或者1,然后加一个子串,询问母串里面有多少个子串,0表示可以重复,1表示不可以重复.   分析:发 ...

  9. ZOJ 3490 String Successor 字符串处理

    一道模拟题,来模拟进位 暴力的从右往左扫描,按规则求后继就好了.除了Sample已给出的,还有一些需要注意的地方: 9的后继是10,而不是00: (z)的后继是(aa),而不是a(a): 输入虽然最长 ...

随机推荐

  1. 性能测试工具---loadrunner

    1.什么是参数化参数化:把固定的一个值,变成动态.可变的数组,把数组的值进行值传递.数组大小可控制.2.为什么要使用参数化,2个原因.1.数据库校验字段值的唯一性.(数据库修改字段的唯一性,可避免参数 ...

  2. 微信小程序制作选项卡

    wxml: <view class="tab"><view class="tab-title" bindtap="tabFun&qu ...

  3. 关于如何在部署环境修改process.env & 本地测试

    前言 最近在搞一些监控的东西, 需要根据不同的环境上报到不同的地址,中间遇到了一些问题,在这里简单总结分享下. 关于process.env 假如你对process.env 相关的概念还不熟悉, 请移步 ...

  4. vue-cli3 搭建的前端项目基础模板

    基于 vue-cli3 搭建的前端模板,fork 或 clone 本仓库,即可搭建完成一个新项目的基础模板,源码地址,欢迎 star 或 fork 特性 CSS 预编译语言:less Ajax: ax ...

  5. python ndarray相关操作:切分

  6. MAC使用技巧之苹果电脑抓图截屏方法

    用苹果电脑自带的截图功能的快捷键:command+shift+3 三个键按下则抓取/截取全屏 command+shift+4 然后用鼠标框选则抓取该区域的截图 command+shift+4 然后按空 ...

  7. 【JZOJ4784】【NOIP2016提高A组模拟9.15】Map

    题目描述 输入 输出 样例输入 4 4 2 1 2 2 3 3 2 3 4 1 2 1 4 样例输出 14 数据范围 样例解释 upd:保证原图连通. "不相交路径"的定义为不存在 ...

  8. Hdu 1800 字符串hash

    题目链接 题意: 给出n(n<=3000)个字符串(长度<30,数字组成,肯能存在前导0), 问该序列最少可以分成多少个单调序列.可以转化成求相同字符串的个数的最大值 附上代码: /*** ...

  9. Unity3D 物体旋转之Quaternion.Slerp

    实现的功能:1个物体以一定的速度转向目标物体 Quaternion TargetRotation = Quaternion.LookRotation(m_Target.transform.positi ...

  10. JavaScript中常用的几种类型检测方法

    javascript中类型检测方法有很多: typeof instanceof Object.prototype.toString constructor duck type 1.typeof 最常见 ...