1. 程式人生 > >noi Big String 超級字符串

noi Big String 超級字符串

數字 sin ams com blog size nbsp src menu

//來自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 超級字符串