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. 1
  2. 2
  3. 4
  4. 8


Sample Output

  1. T
  2. .
  3. ^
  4. 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个字符。

附上代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #define len 88
  4. using namespace std;
  5. int main()
  6. {
  7. char base[]="T.T^__^";
  8. //将斐波那契数列在2^63-1范围之内的数全部计算出来
  9. long long int f[len];
  10. f[]=;
  11. f[]=;
  12. for(int i=; i<len; i++)
  13. f[i]=f[i-]+f[i-];
  14. long long int n;
  15. while(~scanf("%lld",&n))
  16. {
  17. //对于每一个n,减去小于n的最大斐波那契数
  18. while(n>)
  19. {
  20. int i=;
  21. while(i<len&&f[i]<n)
  22. i++;
  23. n-=f[i-];
  24. }
  25. //n中剩下的值,就是该字符在base中的位置
  26. printf("%c\n",base[n-]);
  27. }
  28. return ;
  29. }

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. hdfs 的存储空间扩展

    问题:之前集群上每个节点的的大小为50G, 但是硬盘容量是160G的, 不明白为什么才50个G: 后来发现是因为dfs.data.dir设置的问题,该目录下挂载的磁盘空间的大小就会作为该节点的容量.. ...

  2. SCAN listener and Node listener – How does it work

    http://www.mydbspace.com/? p=324 Single Client Access Name (SCAN) is new feature of oracle 11gR2 gri ...

  3. day38 20-Spring与Junit整合

    package cn.itcast.test; import org.junit.Test; import org.junit.runner.RunWith; import org.springfra ...

  4. 客户端connect返回错误显示No route to host

    务器程序运行起来后,客户端connect返回错误显示No route to host,但是两台机子能ping通 是firewall的问题, services iptables stop应该就ok了

  5. 一句python,一句R︱python中的字符串操作、中文乱码、NaN情况

    一句python,一句R︱python中的字符串操作.中文乱码.NaN情况 先学了R,最近刚刚上手Python,所以想着将python和R结合起来互相对比来更好理解python.最好就是一句pytho ...

  6. php-imagick扩展

    介绍 magick 是用 ImageMagic API 来创建和修改图像的PHP官方扩展.ImageMagick® 是用来创建,编辑,合并位图图像的一套组件. 它能够用于读取,转换,写入多种不同格式的 ...

  7. Failed to delete access_log

    重复build 关闭已经开启的tomcat    terminal 再次开启即可

  8. txt改后缀弹窗表白

    one. 打开新建的文本文件,输入字符:msgbox("此处可替换成你想要出现的文字"),括号和引号是英文状态下的标点.(可根据自己的需要输入多行) two. 保存新建的文本文件, ...

  9. 用var 变量=函数名 方式调用函数时如何传值的问题

    通过:xmlhttp.onreadystatechange= function(){FuncName(param)};orxmlhttp.onreadystatechange= new Functio ...

  10. Effective Modern C++:06lambda表达式

    lambda表达式实际上是语法糖,任何lambda表达式能做到的,手动都能做到,无非是多打几个字.但是lambda作为一种创建函数对象的手段,实在太过方便,自从有了lambda表达式,使用复杂谓词来调 ...