題目:咕咕東的奇妙序列
題意:
輸入:
輸出:
樣例:
解題思路:這個題還是挺難的,主要是資料太大了,如果用字首和只能過前六個點,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....