码迷,mamicode.com
首页 > 其他好文 > 详细

noi Big String 超级字符串

时间:2017-05-26 23:38:44      阅读:406      评论:0      收藏:0      [点我收藏+]

标签:操作   tle   alt   是什么   clu   string   子串   img   noi   

//来自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 超级字符串

标签:操作   tle   alt   是什么   clu   string   子串   img   noi   

原文地址:http://www.cnblogs.com/nengshen/p/6910514.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!