Stern-Brocot 树
参考博客
SB树的特点:
给定输入N,输出0到1之间分母小于或等于N的真分数,并排序,按照上图来看就是每一行。
怎么求第n行的SB树
#include<bits/stdc++.h>
using namespace std;
int n;
typedef pair<int, int> P;
vector<P> vec;
void dfs(int l1 , int l2 , int r1 , int r2) //l1/l2 , r1/r2
{
if (l2 + r2 > n) return ;
//Stern-Brocot树 左侧总是最小的,右侧最大的,那么总是优先输入左侧,再输入中间的,最后输入右侧的数
dfs(l1 , l2 , l1 + r1 , l2 + r2);
// cout << l1 + r1 << "/" << l2 + r2 << " ";
vec.push_back(P(l1 + r1, l2 + r2));
dfs(l1 + r1 , l2 + r2 , r1 , r2);
}
int main() {
n = 7;
// cout << "0/1 ";
vec.push_back(P(0, 1));
dfs(0 , 1 , 1 , 1); //会按从小到大的次序输出结果
// cout << "1/1" << endl;
vec.push_back(P(1, 1));
for (auto c : vec) {
cout << c.first << "/" << c.second << " ";
}
cout << endl;
return 0;
}
- 每一行有多少个?
hdu 4556 - 怎么求第几项
tern-Brocot树上节点的表示
我从单位一设为起始点
总是用一个长字符串表示从单位1 (1/1) 开始走的路径
L表示左走 , R表示右走,当前位置为S
那么用
M
(
S
)
=
(
n
n
′
m
m
′
)
=
(
1
0
0
1
)
M(S) = \begin{pmatrix} n&n' \\ m&m'\end{pmatrix}=\begin{pmatrix} 1&0\\ 0 &1\end{pmatrix}
M(S)=(nmn′m′)=(1001)
的矩阵进行描述
值
F
(
S
)
=
(
m
+
m
′
)
/
(
n
+
n
′
)
F(S) = (m+m')/(n+n')
F(S)=(m+m′)/(n+n′)
往右走
M
(
S
R
)
=
M
(
S
)
∗
M
(
R
)
=
M
(
S
)
∗
(
1
0
1
1
)
M(SR) = M(S) * M(R) = M(S)*\begin{pmatrix}1&0\\1&1 \end{pmatrix}
M(SR)=M(S)∗M(R)=M(S)∗(1101)
往左走
M
(
S
L
)
=
M
(
S
)
∗
M
(
L
)
=
M
(
S
)
∗
(
1
1
0
1
)
M(SL) = M(S) * M(L) = M(S)* \begin{pmatrix}1 &1\\0 &1\end{pmatrix}
M(SL)=M(S)∗M(L)=M(S)∗(1011)
对于连续的都可以用矩阵快速幂求解
如
M
(
S
R
R
R
R
)
=
M
(
S
)
∗
M
(
R
)
4
M(SRRRR) = M(S)*M(R)^4
M(SRRRR)=M(S)∗M(R)4
另外求F(RS) 时 可以发现规律是
F
(
R
S
)
=
F
(
S
)
+
1
,
F
(
L
S
)
=
F
(
S
)
/
(
F
(
S
)
+
1
)
F(RS) = F(S)+1, F(LS) = F(S)/(F(S)+1)
F(RS)=F(S)+1,F(LS)=F(S)/(F(S)+1)