| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:相当简单的 O(1) 算法!In Reply To:相当简单的 O(1) 算法! Posted by:Xz20011115 at 2019-05-15 13:25:47 我的算法其实主要是利用一些数学知识。
对于任意的正整数 n,
记字符序列 n 为 a(n),
记字符序列 123456...n 即 a(1)a(2)...a(n) 为 b(n),
记字符序列 112123...n 即 b(1)b(2)...b(n) 为 c(n),
记 a(n) 的长度为 la(n),
记 b(n) 的长度为 lb(n),
记 c(n) 的长度为 lc(n),
注意到 c(n) 就是题目中的序列。
为了得到 c 序列中的第 i 位, 可以先找到第 i 位所在的 b 序列,
设 c 序列的第 i 位在 b(n+1) 序列,
则 lc(n) < i <= lc(n+1),即 lc(n) <= i-1 < lc(n+1),
计算方程 lc(x) = i-1 的正根,向下取整即为 n,
问题就转化为得到 b 序列中的第 (i-lc(n)) 位.
为了得到 b 序列中的第 i 位, 可以先找到第 i 位所在的 a 序列,
设 b 序列的第 i 位在 a(n+1) 序列,
则 lb(n) < i <= lb(n+1),即 lb(n) <= i-1 < lb(n+1),
计算方程 lb(x) = i-1 的根,向下取整即为 n,
问题就转化为得到 a 序列中的第 (i-lb(n)) 位.
求 a 序列中的第 k 位的方法略。
对于一个正整数 n,我们分类讨论:
A: 1 <= n < 10
la(n) = 1
lb(n) = Σ(la(k)) (k=1...n)
= Σ(1) (k=1...n)
= n
lc(n) = Σ(lb(k)) (k=1...n)
= Σ(k) (k=1...n)
= (n+1)*n/2
lb(9) = 9
lc(9) = 45
解方程 lc(x) = i-1 得
x = sqrtl(i*2-1.75)-.5
解方程 lb(x) = i-1 得
x = i
B: 10 <= n < 100
la(n) = 2
lb(n) = Σ(la(k)) (k=1...n)
= lb(9) + Σ(la(k)) (k=10...n)
= 9 + Σ(2) (k=10...n)
= 2n-9
lc(n) = Σ(lb(k)) (k=1...n)
= lc(9) + Σ(lb(k)) (k=10...n)
= 45 + Σ(2k-9) (k=10...n)
= (n-8)*n+36
lb(99) = 189
lc(99) = 9045
解方程 lc(x) = i-1 得
x = sqrtl(i-21)+4
解方程 lb(x) = i-1 得
x = (i+10)/2
C: 100 <= n < 1000
la(n) = 3
lb(n) = Σ(la(k)) (k=1...n)
= lb(99) + Σ(la(k)) (k=100...n)
= 189 + Σ(3) (k=100...n)
= 3n-108
lc(n) = Σ(lb(k)) (k=1...n)
= lc(99) + Σ(lb(k)) (k=100...n)
= 9045 + Σ(3k-108) (k=100...n)
= (n*3-213)*n/2+4887
lb(999) = 2889
lc(999) = 1395495
解方程 lc(x) = i-1 得
x = (sqrtl(i*6-17985.75)+106.5)/3
解方程 lb(x) = i-1 得
x = (i+110)/3
D: 1000 <= n < 10000
la(n) = 4
lb(n) = Σ(la(k)) (k=1...n)
= lb(999) + Σ(la(k)) (k=1000...n)
= 2889 + Σ(4) (k=1000...n)
= 4n-1107
lc(n) = Σ(lb(k)) (k=1...n)
= lc(999) + Σ(lb(k)) (k=1000...n)
= 1395495 + Σ(4n-1107) (k=1000...n)
= (n*2-1105)*n+503388
lb(9999) = 38889
lc(9999) = 189414495
解方程 lc(x) = i-1 得
x = sqrtl(i*.5-175385.4375)+276.25
解方程 lb(x) = i-1 得
x = (i+1110)/4
E: 10000 <= n < 100000
la(n) = 5
lb(n) = Σ(la(k)) (k=1...n)
= lb(9999) + Σ(la(k)) (k=10000...n)
= 38889 + Σ(5) (k=10000...n)
= 5n-11106
lc(n) = Σ(lb(k)) (k=1...n)
= lc(9999) + Σ(lb(k)) (k=10000...n)
= 189414495 + Σ(5n-11106) (k=10000...n)
= (n*5-22207)*n/2+50488389
lb(99999) = 488889
lc(99999) = 23939649495
解方程 lc(x) = i-1 得
x = sqrtl(i*.4-15263847.51)+2220.7
解方程 lb(x) = i-1 得
x = (i+11110)/5
注意到 lc(99999) > 2147483647, 所以 n < 100000, 不需要继续分类了.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator