hdu 4556 Stern-Brocot Tree
来源:互联网 发布:网络形容男人的词 编辑:程序博客网 时间:2024/04/26 17:18
Stern-Brocot Tree
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Problem Description
上图是一棵Stern-Brocot树,其生成规则如下:
从第1行到第n行,每行相邻两数a/b和c/d,产生中间数(a+c)/(b+d),置于下一行中。将一行的分数(包括0/1,1/0),进行约分简化,则每一行(包括0/1,1/0,1/1),不会出现两个相同的分数。若分子或者分母大于n,则去掉该分数,将剩下的分数,从小到大排序,得到数列F。
现在请您编程计算第n行的数列F的个数。
Input
输入包含多组测试用例,每组输入数据是一个正整数n(n<=1000000)。
Output
对于每组的测试数据n,请输出第n行的数列F的个数。
Sample Input
1246
Sample Output
351325
仔细看图可以发现:对于每一行都可以看成是关于1/1对称的两部分,所以只需求出1/1左边的个数就可求出这一行的个数。而左边全部都是真分数,分母为x的真分数的个数就是x的欧拉函数值。n最大为1000000,所以可以递推打表。
#include<cstdio>const int N = 1000001;int e[N];__int64 a[N], res = 0;void euler(){ for(int i = 2; i < N; i++) e[i] = 0; e[1] = 1; for(int i = 2; i < N; i++) if(!e[i]) { for(int j = i; j < N; j += i) { if(!e[j]) e[j] = j; e[j] = e[j] / i * (i-1); } }}int main(){ int i, n; euler(); for(i = 1; i < N; i++) { res += e[i]; a[i] = res * 2 + 1; } while(~scanf("%d", &n)) printf("%I64d\n", a[n]); return 0;}
0 0
- HDU-4556-Stern-Brocot Tree
- hdu 4556 Stern-Brocot Tree
- hdu 4556 Stern-Brocot Tree
- HDU 4556 Stern-Brocot Tree
- hdu 4556 Stern-Brocot
- HDOJ 4556 Stern-Brocot Tree
- hdu4556-Stern-Brocot Tree
- hdu4556-Stern-Brocot Tree
- Hdu 6209 The Intersection(Stern-Brocot tree+二分)
- hdoj 4556 Stern-Brocot Tree(欧拉函数)
- hdu4556 西山居四 Stern-Brocot Tree
- PE 372 【类欧几里德】【Stern-Brocot Tree】
- HDOJ 题目4556Stern-Brocot Tree(数学,欧拉函数)
- hdoj Stern-Brocot Tree 4556 (欧拉函数打表)
- Farey序列(Stern-Brocot tree的衍生)
- [Codeforces 585C] Alice, Bob, Oranges and Apples (Stern-Brocot Tree + 更相减损法)
- hdu4556 Stern-Brocot Tree(欧拉函数递推关系)
- Farey序列与Stern-Brocot树
- oracle--left join and 和left join where的区别
- Weblogic学习笔记-weblogic12c安装
- 我们可以转身,但是不必回头
- U-boot启动问题问答
- java验证码的生成
- hdu 4556 Stern-Brocot Tree
- sql行转列:越简单越好
- ajax mvc 请求 url 路径
- 排序算法归纳总结
- linux下释放cache内存
- ETL增量抽取方案
- 时间转化的处理
- C++定义动态数组
- 数据抓取的艺术(一~三):Selenium+Phantomjs数据抓取环境配置