首页 > 代码库 > 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 超级字符串