FZU 1064 教授的测试
2016-03-17 21:24
337 查看
递归构造答案。
根据当前整颗树的编号,可以计算左右子树有几个节点以及编号。因此,不断dfs下去就可以了。
根据当前整颗树的编号,可以计算左右子树有几个节点以及编号。因此,不断dfs下去就可以了。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; long long c[20] = { 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790 }; long long n; void dfs(long long num, long long p) { long long left=0, right=0, sum = 0,left_p, right_p; int level = (int)num; for (int i = 0; i <= level-1; i++) { sum = sum + c[i] * c[level - 1 - i]; if (sum >= p) { sum = sum - c[i] * c[level - 1 - i]; p = p - sum; left = (long long)i; right = (long long)(level - 1 - i); if (c[level - 1 - i] == 1) left_p = p / c[level - 1 - i]; else left_p = p / c[level - 1 - i] + 1; right_p = p% c[level - 1 - i]; if (right_p == 0) right_p = c[level - 1 - i]; break; } } if (left != 0){printf("(");dfs(left, left_p);printf(")");} printf("X"); if (right != 0){printf("(");dfs(right, right_p);printf(")");} } void work() { long long p, left, right, sum = 0,left_p=0, right_p=0; int level; for (int i = 1; i <= 17; i++) { sum = sum + c[i]; if (sum >= n){ sum = sum - c[i]; level = i; p = n - sum; break; } } dfs((long long)level, p); printf("\n"); } int main() { while (~scanf("%lld", &n)) { if (!n) break; work(); } return 0; }
相关文章推荐
- FZU 1397 保送
- 条件变量--pthread_cond_t(小程序)
- Android常用的颜色代码值
- jquery 多标签添加 活动标签 促销标签
- PB动态SQL
- iOS 多线程 各种锁
- 所学新知——int、char型转string 类型等
- wicket基础应用(3)——wicket控件的隐藏和显示
- KVM原理与架构系列之二 基本原理篇
- 9中UML图
- FZU 1064 教授的测试
- Android TextView 自定义ClickableSpan实现@ 超链接
- 最小生成树:Kruskal算法 和 Prim算法(第23章)
- 我的第一个网页
- banner图片自适应
- Web2.0 TA 问题记录
- FZU 1063 三维扫描
- 电路与电子学-第一章直流电路分析方法小概括
- 毕业设计第三十天
- Bzoj1875: [SDOI2009]HH去散步:邻接矩阵的幂