//来自2017青岛信息竞赛第一题
9269:Big String超级字符串
- 总时间限制:
- 10000ms
- 单个测试点时间限制:
- 1000ms
- 内存限制:
- 131072kB
- 描述
-
fish在无数次oi竞赛的狱炼之后,悟出一个真理,往往越容易的题目,陷阱越深。由此,fish创作了这道题目。
fish首先给出两个短串A=’4567’ (4个字符), B=’123’(3个字符)。反复进行如下的操作得到一个长串C。
(1)C=B+A (例如:A=’4567’ ,B=’123’ C=B+A=’1234567’)
(2)A=B B=C (上述例子 A=’123’ B=’1234567’)
请你编程找出这个长串的第n个字符。 - 输入
-
第一行包含一个整数 n (1<=n<=10^9)
- 输出
-
仅一行,包含一个字符,表示这个长串的第n个字符。
- 样例输入
-
9
- 样例输出
- 2
-
比赛发挥不好,明明已经找到正解了,却卡了一下,没处理出来
其实很简单,不要直接处理字符串,转化成数字
可以发现整个字符串就是“1234567”不断拓展出去的
每一个新子串都可以看做是1234567或它的子串组成的
那么我们只需要知道第n位是1234567 中的第几位,而对这个那么长的子串究竟是什么根本没用=。=
用数字存一共有几位,然后处理
例如9,
我们发现一次运算后c长7,第二次长...
9就在这之间
说明需要进行两次拓展才有第九位
然而前七位对我们来说是没用的
所以直接不管
因此九位为就相当于剩下的第二位,小于7,所以直接得到(若大于7只需重复上述过程)
附AC代码#include<cstring> #include<cstdio> #include<iostream> using namespace std; string s; int l,n,pr; int main(){ s="1234567"; int a=4,b=3; scanf("%d",&n); while(n>7){ a=4;b=3; l=0;pr=0; while(l<n){ pr=l; l=b+a; a=b; b=l; } n=n-pr; } cout<<s[n-1]; }