- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
你得到一个整数 n,你需要找到它在 Stern 双原子数列中第一次出现的索引。
序列定义如下:
a[0] = 0
a[1] = 1
a[2*i] = a[i]
a[2*i+1] = a[i] + a[i+1]
最佳答案
我们可以在四秒内轻松解决第一次出现 400000 范围内的数字:
Prelude Diatomic> firstDiatomic 400000
363490989
(0.03 secs, 26265328 bytes)
Prelude Diatomic> map firstDiatomic [400000 .. 400100]
[363490989,323659475,580472163,362981813,349334091,355685483,346478235,355707595
,291165867,346344083,347155797,316314293,576398643,315265835,313171245,355183267
,315444051,315970205,575509833,311741035,340569429,313223987,565355925,296441165
,361911645,312104147,557145429,317106853,323637939,324425077,610613547,311579309
,316037811,311744107,342436533,348992869,313382235,325406123,355818699,312128723
,347230875,324752171,313178421,312841811,313215645,321754459,576114987,325793195
,313148763,558545581,355294101,359224397,345462093,307583675,355677549,312120731
,341404245,316298389,581506779,345401947,312109779,316315061,315987123,313447771
,361540179,313878107,304788843,325765547,316036275,313731751,355635795,312035947
,346756533,313873883,349358379,357393763,559244877,313317739,325364139,312128107
,580201947,358182323,314944173,357403987,584291115,312158827,347448723,363246413
,315935571,349386085,315929427,312137323,357247725,313207657,320121429,356954923
,557139285,296392013,576042123,311726765,296408397]
(2.45 secs, 3201358192 bytes)
1/1
开始,它由以下规则构建:对于具有分数
a/b
的节点,其左 child 携带分数
a/(a+b)
,其右 child 携带分数
(a+b)/b
。
1/1
/ \
/ \
/ \
1/2 2/1
/ \ / \
1/3 3/2 2/3 3/1
1
/ \
/ \
/ \
2 3
/ \ / \
4 5 6 7
/ \
8 9 ...
k
处的节点携带分数
a[k]/a[k+1]
。
k = 1
(
a[1] = a[2] = 1
) 显然是这样,从那时起,
k = 2*j
我们有索引为 j
的节点的左 child ,所以分数是 a[j]/(a[j]+a[j+1])
和 a[k] = a[j]
和 a[k+1] = a[j] + a[j+1]
是序列的定义方程。 k = 2*j+1
我们有索引为 j
的节点的右 child ,所以分数是 (a[j]+a[j+1])/a[j+1]
并且通过定义方程再次是 a[k]/a[k+1]
。 0/1
扩充 Calkin-Wilf 树,该节点的右子节点是
1/1
节点,这样我们就需要对索引的最重要的设置位有一个步骤。)
p/q
,确定其索引。
p > q
。那么我们知道
p/q
是一个右 child ,它的 parent 是
(p-q)/q
。如果也是
p-q > q
,我们又有一个右 child ,其 parent 是
(p - 2*q)/q
。继续,如果
p = a*q + b, 1 <= b < q
p/q
次,从
b/q
节点到达
a
节点。
b/q
的父级是
b/(q-b)
。如果
q = c*b + d, 1 <= d < b
c
到左子节点
b/d
次才能到达
b/q
。
1/1
的连分数(这里只考虑简单连分数)展开式找到从根节点 (
p/q
) 到
p/q
节点的路径。让
p > q
和
p/q = [a_0, a_1, ..., a_r,1]
p/q
的连分数展开式以
1
结尾。
r
是偶数,则到右 child a_r
次,然后到左 a_(r-1)
次,然后到右 child ... 然后 a_1
次到左 child ,最后a_0
次向右。 r
是奇数,那么首先去左 child a_r
次,然后 a_(r-1)
次到右边......然后 a_1
次到左 child ,最后 a_0
次到正确的。 p < q
,我们必须结束向左走,因此开始向左走偶数
r
并开始向右走奇数
r
。
k
的游程编码为
[c_1, c_2, ..., c_j] (all c_i > 0)
k
的二进制表示以
c_1
开始,然后是
c_2
零,然后是
c_3
等,并以
c_j
结束
k
是奇数 - 因此 j
也是奇数; k
是偶数 - 因此 j
也是偶数。 [c_j, c_(j-1), ..., c_2, c_1]
是
a[k]/a[k+1]
的连分数展开式,其长度与
k
具有相同的奇偶性(每个有理数正好有两个连分数展开式,一个是奇数长度,另一个是偶数长度)。
0/1
上方的
1/1
节点到
a[k]/a[k+1]
的路径。路径的长度是
k
和 n > 0
的第一次出现的索引,我们首先观察到最小的索引必须是奇数,因为
a[k] = a[k/2]
对于偶数
k
。设最小索引为
k = 2*j+1
。然后
k
的 RLE 的长度是奇数,k
的节点处的分数是 a[2*j+1]/a[2*j+2] = (a[j] + a[j+1])/a[j+1]
,因此它是右 child 。 k
的最小索引
a[k] = n
对应于所有到具有分子
n
的节点的最短路径的最左端。
n/m
的连分数展开式,其中
0 < m <= n
与
n
[分数必须减少] 互质,部分商的总和最小。
p/q = [a_0, a_1, ..., a_r]
和
a_0 > 0
和
s = a_0 + ... + a_r
p
以
F(s+1)
为界,分母
q
以
F(s)
为界,其中
F(j)
是
j
-th Fibonacci 数。界限是尖锐的,对于
a_0 = a_1 = ... = a_r = 1
分数是
F(s+1)/F(s)
。
F(t) < n <= F(t+1)
,连分数展开式(两者之一)的部分商之和为
>= t
。通常有一个
m
使得
n/m
的连分数展开的部分商的总和正好是
t
,但并不总是:
F(5) = 5 < 6 <= F(6) = 8
6/m
和
0 < m <= 6
的连分数展开式是
6/1 = [6] (alternatively [5,1])
6/5 = [1,4,1] (alternatively [1,5])
t+2
)。
n/m
和
n/(n-m)
的连分数展开密切相关。让我们假设
m < n/2
,让
n/m = [a_0, a_1, ..., a_r]
a_0 >= 2
,
(n-m)/m = [a_0 - 1, a_1, ..., a_r]
n/(n-m) = 1 + m/(n-m) = 1 + 1/((n-m)/m)
n/(n-m)
的连分数展开式是
n/(n-m) = [1, a_0 - 1, a_1, ..., a_r]
m
,所以算法是(我假设
n > 2
0 < m < n/2
与 n
的互质,求 n/m
的连分数展开式,收集部分商和最小的那些(通常的算法产生最后部分商为 > 1
的展开式)假使,假设)。 [a_0, a_1, ..., a_r]
的长度为偶数,则将其转换为 [a_0, a_1, ..., a_(r-1), a_r - 1, 1]
[1, a_0 - 1, a_1, ..., a_(r-1), a_r - 1, 1]
n/m
和
n/(n-m)
之间选择一个导致较小的索引)
module Diatomic (diatomic, firstDiatomic, fuscs) where
import Data.List
strip :: Int -> Int -> Int
strip p = go
where
go n = case n `quotRem` p of
(q,r) | r == 0 -> go q
| otherwise -> n
primeFactors :: Int -> [Int]
primeFactors n
| n < 1 = error "primeFactors: non-positive argument"
| n == 1 = []
| n `rem` 2 == 0 = 2 : go (strip 2 (n `quot` 2)) 3
| otherwise = go n 3
where
go 1 _ = []
go m p
| m < p*p = [m]
| r == 0 = p : go (strip p q) (p+2)
| otherwise = go m (p+2)
where
(q,r) = m `quotRem` p
contFracLim :: Int -> Int -> Int -> Maybe [Int]
contFracLim = go []
where
go acc lim n d = case n `quotRem` d of
(a,b) | lim < a -> Nothing
| b == 0 -> Just (a:acc)
| otherwise -> go (a:acc) (lim - a) d b
fixUpCF :: [Int] -> [Int]
fixUpCF [a]
| a < 3 = [a]
| otherwise = [1,a-2,1]
fixUpCF xs
| even (length xs) = case xs of
(1:_) -> fixEnd xs
(a:bs) -> 1 : (a-1) : bs
| otherwise = case xs of
(1:_) -> xs
(a:bs) -> 1 : fixEnd ((a-1):bs)
fixEnd :: [Int] -> [Int]
fixEnd [a,1] = [a+1]
fixEnd [a] = [a-1,1]
fixEnd (a:bs) = a : fixEnd bs
fixEnd _ = error "Shouldn't have called fixEnd with an empty list"
cfCompare :: [Int] -> [Int] -> Ordering
cfCompare (a:bs) (c:ds) = case compare a c of
EQ -> cfCompare ds bs
cp -> cp
fibs :: [Integer]
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
toNumber :: [Int] -> Integer
toNumber = foldl' ((+) . (*2)) 0 . concat . (flip (zipWith replicate) $ cycle [1,0])
fuscs :: Integer -> (Integer, Integer)
fuscs 0 = (0,1)
fuscs 1 = (1,1)
fuscs n = case n `quotRem` 2 of
(q,r) -> let (a,b) = fuscs q
in if r == 0
then (a,a+b)
else (a+b,b)
diatomic :: Integer -> Integer
diatomic = fst . fuscs
firstDiatomic :: Int -> Integer
firstDiatomic n
| n < 0 = error "Diatomic sequence has no negative terms"
| n < 2 = fromIntegral n
| n == 2 = 3
| otherwise = toNumber $ bestCF n
bestCF :: Int -> [Int]
bestCF n = check [] estimate start
where
pfs = primeFactors n
(step,ops) = case pfs of
(2:xs) -> (2,xs)
_ -> (1,pfs)
start0 = (n-1) `quot` 2
start | even n && even start0 = start0 - 1
| otherwise = start0
eligible k = all ((/= 0) . (k `rem`)) ops
estimate = length (takeWhile (<= fromIntegral n) fibs) + 2
check candidates lim k
| k < 1 || n `quot` k >= lim = if null candidates
then check [] (2*lim) start
else minimumBy cfCompare candidates
| eligible k = case contFracLim lim n k of
Nothing -> check candidates lim (k-step)
Just cf -> let s = sum cf
in if s < lim
then check [fixUpCF cf] s (k - step)
else check (fixUpCF cf : candidates) lim (k-step)
| otherwise = check candidates lim (k-step)
关于algorithm - 首次出现在斯特恩的双原子序列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16373790/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!