定义:

对任意给定的一个自然数n,将分母小于等于n的不可约的真分数按升序排列,并且在第一个分数之前加上0/1,在最后一个分数之后加上1/1,这个序列称为n级法雷数列,即法雷数列是0和1之间最简分数升序排列的数列,所以n级法雷数列的个数即为 满足 1 <= a < b <= n && gcd( a , b ) == 1 的二元组( a , b )的数量 + 2(0/1 和 1/1)

性质:

除了1级法雷数列外,所有的法雷数列都有奇数个元素,其中居于正中间的那个元素一定是1/2.

n级法雷数列中,若相邻两个元素是 a / b 和 c / d ( a / b < c / d ),则这两个数的差为1 / bd, 这个差的最小值为1/(n*(n-1)), 最大值为1/n,,在法雷数列的第一个元素(0/1)与其后继以及最后一个元素(1/1)与前驱之间的差取到最大值,而正中间的那个元素1/2 与其前驱和后继元素之间的差取次大值1/(n*2).

任意两个相邻元素 a / b 和 c / d   ( a / b < c / d ),满足 b * c - a * d == 1

任意三个相邻元素,中间元素 == (前驱元素分子 + 后继元素分子)/(前驱元素分母 + 后继元素分母)

设F(n)为第n级法雷数列的个数,phi(n)为欧拉函数的值,则F( n ) = F( n-1 ) + phi( n )   ( 考虑法雷序列定义 ,正确性显然)

当n趋于正无穷时,n级法雷数列包含的元素的个数趋于 3 * n * n / ( pi * pi )    ( pi = acos(-1) )

构造:

根据性质4即可简单构造,Stern-Brocot树是一种数据结构,能构造法雷数列。Stern-Brocot树是从0 (= 0⁄1)和1 (= 1⁄1)开始,取中间分数来构成法里数列,即根据性质4构造。

Stern-Brocot树生成规则:

上图是一棵Stern-Brocot树,其生成规则如下:

从第1行到第n行,每行相邻两数a/b和c/d,产生中间数(a+c)/(b+d),置于下一行中。将一行的分数(包括0/1,1/0),进行约分简化,则每一行(包括0/1,1/0,1/1),不会出现两个相同的分数。若分子或者分母大于n,则去掉该分数,将剩下的分数,从小到大排序,得到数列F。

根据这个思路,代码也比较好写

#include

using namespacestd;intn;void dfs(int a1, int b1, int a2, int b2) //a1/b1 , a2/b2

{if (b1 + b2 >n)return;

dfs(a1, b1, a1+ a2, b1 + b2);//先左边,左边比较小

printf("%d/%d",a1+a2,b1+b2);

dfs(a1+ a2, b1 + b2, a2, b2);//右边

}intmain()

{

scanf("%d",&n); //序列级数

printf("0/1");

dfs(0, 1, 1, 1); //会从小到大输出结果

printf("1/1\n");return 0;

}

正确性:

如何保证这种方法生成的都是最简分数?

利用性质3和数学归纳法易证

如何保证不重不漏?

不重:因为有序,所以,不重,为什么有序?根据该算法思想显然,不显然的话看代码就显然了

不漏:每个分数都是从其一个上界和下届逼近,类似二分,显然不漏

例题:

HDU6624 fraction   (这一题算是法雷数列的一个扩展,就是求两个分数之间分母最小的分数为多少)

c语言输出法雷序列,法雷(法里)序列 - osc_h0wb1wlt的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. c语言问答题斐讯通信,C总结-part_1 - LinearLaw的个人空间 - OSCHINA - 中文开源技术交流社区...

    1_C语言概述 1.库引用 1.1.几个例子 例1,调用系统指令 // b.c #include int main(void) { // system函数,相当于在命令行界面中输入对应的命令 syst ...

  2. 直白点理解c 语言中的循环体,反射机制 小小谈 - osc_nnbkiac5的个人空间 - OSCHINA - 中文开源技术交流社区...

    反射机制(Reflection) [TOC] 写在前面 本文地址:https://www.cnblogs.com/oberon-zjt0806/p/11082012.html 这里是Oberon 本文 ...

  3. linux冒泡算法程序,用蛮力法解决冒泡排序 - linux-tao的个人空间 - OSCHINA - 中文开源技术交流社区...

    冒泡排序是蛮力法的另一个经典体现. 算法思想:比较列表中相邻的元素,如果是逆序的话,就交换他们的位置.重复多次之后,最大的元素就排到了最后一个位置.第二遍操作将第二个元素排到了倒数第二个位置上,这样一 ...

  4. linux命令前期记不住,linux前期 - 浪里小白龙l的个人空间 - OSCHINA - 中文开源技术交流社区...

    Linux安装说明 1.4安装虚拟机  创建新的虚拟机 选择典型,点击下一步 选择第三项,稍后安装操作系统. 操作系统这里选择Linux ,因为我们的教材是centos 7 ,所以版本这个地方选择ce ...

  5. php 递归太多报错,PHP、递归 - 角落里的星辰的个人空间 - OSCHINA - 中文开源技术交流社区...

    //递归遍历文件 //递归:实现流程分析 /* *1.先找到父问题,定义函数,解决父问题(遍历给定路径文件里面的所有文件) *2.找出递归点,子问题调用自己的函数解决问题,(遍历文件下的所有文件) * ...

  6. c语言 开辟复数指针数组,指针和数组 - llwwzz的个人空间 - OSCHINA - 中文开源技术交流社区...

    指针的几个要点: 一 指针的定义,赋值 要区分: int a; int *p = &a; 这是定义的时候初始化,即赋值 ======================= int a; int * ...

  7. c语言switch判断星座,通过日期计算星座 - osc_d41sfzmu的个人空间 - OSCHINA - 中文开源技术交流社区...

    分析和理解根据日期计算星座函数 起始月份 号数 星座 结束月份 号数 时间区间 12 22 摩羯座 1 19 12/22 - 1/19 1 20 水瓶座 2 18 1/20 - 2/18 2 19 双 ...

  8. c语言选择排序输出指定趟数结果,C语言之选择排序 - 杨源鑫的个人空间 - OSCHINA - 中文开源技术交流社区...

    选择法排序是相对好理解的排序算法.假设要对含有n个数的序列进行升序排列,算法步骤是: 1.从数组存放的n个数中找出最小数的下标(算法见下面的"求最值"),然后将最小数与第1个数交换 ...

  9. C语言十个字母用冒泡法排序,冒泡排序法(C语言) - osc_wq8j2a9a的个人空间 - OSCHINA - 中文开源技术交流社区...

    常用的排序方法有冒泡排序法,选择排序法,插入排序法以及希尔排序法等.本文着重讲解如何利用C代码,实现冒泡排序. 首先,要了解什么是冒泡排序.冒泡排序是常用的一种排序方法,其基本方法就是逐次比较.即一次 ...

最新文章

  1. 史上最全《知识图谱》2020综述论文!!!
  2. C#中Invoke的用法
  3. Shader Compiler 界面进展2
  4. ssm使用全注解实现增删改查案例——applicationContext.xml
  5. WGCNA | weighted correlation network analysis
  6. oracle拓展磁盘空间,Oracle磁盘空间使用统计
  7. Spring自学日志00(Spring配置文件头及xsd文件版本浅析)
  8. 云原生2.0时代,华为云DevOps立体运维实践
  9. BUAA OO 2019 第一单元作业总结
  10. 计算机控制技术数据存储器有,计算机控制技术复习资料.doc
  11. Java 并发编程之美:线程相关的基础知识
  12. 用java编写汽车_java,编写一个汽车类
  13. 基于链表的学生信息管理系统和基于MySQL的学生信息管理系统 -C语言
  14. ABC Amber CHM Converter:CHM转换PDF
  15. 人工智能,机器学习, 深度学习框架图
  16. 音频合并的步骤有哪些
  17. 如何在Ubuntu 16.04上使用ProxySQL缓存优化MySQL查询
  18. Android Mms短信的发送流程,短信发送源码解析
  19. win10下CUDA版本卸载与更新
  20. 3.项目立项管理+信息系统项目管理+野马合集

热门文章

  1. 自动升降压PD快充方案 30W快充TYPE-C方案
  2. 软件安全实验——lab7(缓冲区溢出3:返回导向编程技术ROP)
  3. TP6基础知识【新框架】
  4. SIPM模拟器 MIPS汇编语言实现读取文件
  5. 快准全!极光iAPP在手,APP动态全都有
  6. 液化气瓶爆炸总发生,要为监管敲警钟
  7. MUI中vue的@click事件没反应
  8. Java 阿里云图片添加水印
  9. 所有设备都不安全 只要连WiFi 就会被入侵
  10. 快速实现抖音的分享登录(android)