首页 > 代码库 > noi Big String 超级字符串
noi Big String 超级字符串
//来自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]; }
noi Big String 超级字符串
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。