首页 > 代码库 > 【NOI题库】9269:Big String超级字符串

【NOI题库】9269:Big String超级字符串

传送门:http://noi.openjudge.cn/ch0207/9269/

//------------------------------------题目内容--------------------------------------

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

//----------------------------------------解题-----------------------------------------

先来观察一下a,b,c的长度变化:

技术分享

 

可以发现嘛,这个字符串的构成只有1,2,3,4,5,6,7这几个字符,

而且4,5,6,7只会属于‘4567’,而1,2,3只会属于‘123’,

然后呢,但操作次数为单数时,字符串【c】末段一定是‘4567’【长度为4】

但操作次数为偶数时,字符串【c】末段一定是‘123’【长度为3】

--------------------------------------------

思路:

可以用递归查找那个要找的那个字符在123或4567中的第几位,找到后输出就可以啦

技术分享

技术分享

代码:

 1 program chaojizifuchuan; 2 var 3   n,tochange,tcd:longint; 4 //----------------------------------------------------------------------------- 5 function need(t1:longint):longint;//需要进行几步操作 6 var 7   sum,xh,sum2,su:longint; 8 begin 9   xh:=2;              //默认需要两步10   sum:=7;            //xh-1步的字符串长度11   sum2:=10;          //xh步的字符串长度12   while sum2<t1 do       //当xh步的字符串长度小于t1时13   begin14     inc(xh);                  //在增加一步                 15     su:=sum2;                //备份sum216     sum2:=sum+sum2;        //增加sum217     sum:=su;                  //sum=上一步时的sum2    18   end;19   if t1<=7 then xh:=1;   //如果t1小于等于7只需要一步即可20   tochange:=sum2;     //tochange用于记录此时xh步的字符串长度【全局变量】21   tcd:=sum;             //tcd用于记录此时xh-1步的字符串长度【全局变量】22   exit(xh);              //返回xh步23 end;24 //-----------------------------------------------------------------------------25 procedure printf(t2:char);26 begin27   writeln(t2);       //输出28   halt;               //终止主程序29 end;30 //-----------------------------------------------------------------------------31 procedure try(len:longint);32 var33   bu,total,last:longint;34   c:string;35 begin36   if len<=7 then begin                //小于等于7时37                          c:=1234567;38                          printf(c[len]);39                      end40   else begin                               //大于7时41             bu:=need(len);                   //求所需步数42             total:=tochange;               //记录bu步时字符串长度43             tochange:=0;                     //还原tochange44             if odd(bu) then last:=4 45                   else last:=3; //如果所需步数为单数就是’4567‘结尾,若是双数就是‘123’结尾46             if len>=total-last then begin     //如果在字符串末段47                                                 if last=4 then c:=456748                                                    else c:=123; //last记录的是末段的长度嘛49                                                 printf(c[len-total+last]);  //输出50                                             end51             else begin52                      dec(bu);        //这个似乎可以删掉QAQ53                      total:=tcd;   //上一步长度54                      tcd:=0;    //还原tcd55                      try(len-total);//继续try那个lastend到len段【其长度就是len减去上一步的长度】56                    end;57         end;58 59 end;60 //-----------------------------------------------------------------------------61 begin62     readln(n);              //读入63     try(n);                   //try64 end.

//中秋快乐QAQ         ----于2016.9.15

 

【NOI题库】9269:Big String超级字符串