咕咕東的奇妙序列

2021-10-04 20:27:32 字數 1948 閱讀 4033

題目:咕咕東的奇妙序列

題意:

輸入:

輸出:

樣例:

解題思路:這個題還是挺難的,主要是資料太大了,如果用字首和只能過前六個點,1e18不是鬧著玩的,陣列裝不下的;這裡說說我的思路:首先,我先搞個大小為8的陣列,存的是從1-10^i的數:

如,陣列第乙個元素為

112123123412345…123456789大小為45

陣列第二個元素為

112123…123…9123…10123…11…123…99到99

第三個元素到999

直到第8個元素(因為第九個元素已經大於1e18了,所以直到第八個元素)

之後,我讓給的k減去其中小於k的最大的那個元素;

這時候,k剩下的就是123…(10^i) 123… .(10^i+1)…每個組(即123…x,x之後是1)最後乙個元素位數相同;之後用k不停的減去每個組的元素個數,直到k小於那個組的元素個數,但是這裡要注意,如果k過大是會超時的;所以我這裡採用了二分的方法優化了這個選擇的時間;之後剩下的就是乙個123…x這樣乙個組,取其中第k個就行,這裡我用的是遞迴的方法,先用k和9比較,大於9再和180比較(10,11,…99一共180位),大於再繼續比較。。。直到小於等於,然後這時候剩下的元素位數都相同(第乙個元素一定是10的i次方),你又知道k,求就行了;

**:

#include

#include

using

namespace std;

long

long t[17]

=;long

long h[17]

=;long

long t1[17]

=;void

solve()

t[0]

=0; t1[0]

=0;for

(int i=

1;i<=

16;i++

)//t1[i]存的是從1-10^i-1的元素的個數

for(

int i=

1;i<=

8;i++

)//t[i]存的就是從組1到組123...10^1-1的元素的個數

}long

long

sol1

(long

long k,

int num)

else

total=total-k2;

for(

int i=

0;i) n=n%10;

return n;}}

else

//大於前去遞迴

}long

long

sol(

long

long k)}if

(k==0)

//減去那個最大的,如果為0直接返回9就行

long

long p1=t1[p]

;//這個是減去的那個從1-10^i-1的元素的個數

p++;while(1

)else

} k=k-

(l*p1+p*

(l-1

)*l/2)

;//減去,之後剩下的就是123....x

k=sol1

(k,1);

//判斷

return k;}}

intmain()

}

C 咕咕東的奇妙序列

乙個序列 112123123412345123456 即第一部分包含1至1之間的所有數字,第二部分包含1至2之間的所有數字,第三部分包含1至3之間的所有數字,第i部分總是包含1至i之間的所有數字。求第k項數字是多少,注意第56項的數字為0.由分析可知 第一部分到第九部分相鄰部分的數字長度加一 第十部...

M2 C 咕咕東的奇妙序列

題目 思路我覺得這道題非常難,一開始我完全找不到思路,只能盡量的騙分,後來問了別人才明白怎麼做。本題最核心的是兩個陣列,ret1和ret2。ret2 i 儲存的是從1到最大的i位數的子串的位數,做法是ret i 1 i位的所有數的位數,比如ret 2 即1 99的位數,就是1 9的位數 ret i ...

咕咕東的奇妙序列 二分 數字模擬

poj 1019 number sequence 題目給出一種序列表示方式,可以表示為 1 12 123 1234 12345678910 序列不帶空格 也就是說序列可被分組,第 i 組包含的是1到 i 的所有數字。題目給出多個詢問要求每次得到序列中第 k 位的數字。注意 k 要能取到 10 18....