POJ 1095 找规律+递归打印
2013-07-02 14:15
337 查看
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <map> #include <set> #include <algorithm> #include <ctime> #include <vector> #include <string> #include <stack> #include <queue> using namespace std; #define ll long long struct Node { Node *left; Node *right; Node() { left=right=NULL; } }; ll f[30],s[30]; Node *solve(ll n) { if(n==0) return NULL; Node *now = new Node(); if(n==1) return now; int p=lower_bound(s+1,s+20,n)-s; p--; n-=s[p]; // p son int rnum; ll t=n; for(rnum=p;rnum>=0;--rnum) { t-=f[p-rnum]*f[rnum]; if(t<=0) break; n=t; } int left_num=(n-1)/f[rnum]+1; if(p-rnum>0) left_num+=s[p-rnum-1]; else left_num=0; int right_num=(n-1)%f[rnum]+1; if(rnum>0) right_num+=s[rnum-1]; else right_num=0; now->left=solve(left_num); now->right=solve(right_num); return now; } void out(Node *p) { if(p->left!=NULL) { printf("("); out(p->left); printf(")"); } printf("X"); if(p->right!=NULL) { printf("("); out(p->right); printf(")"); } } int main () { f[0]=1;s[0]=0; for(int i=1;i<=20;++i) { f[i]=0; for(int j=0;j<=i-1;++j) f[i]+=f[j]*f[i-1-j]; s[i]=s[i-1]+f[i]; } ll n; while(cin>>n) { if(n==0) break; Node *ptr=solve(n); if(ptr==NULL) printf("X\n"); else { out(ptr); printf("\n"); } } return 0; }
相关文章推荐
- (简单递归3.4.1)POJ 2083 Fractal(分形图的打印)
- ★Uva 1626 && POJ 1141 Brackets sequence 详细题解(区间DP+递归打印)
- poj 1775 简单的递归 dfs 找规律
- POJ 1095 Trees Made to Order(卡特兰数+递归)
- poj 1941 The Sierpinski Fractal(递归打印图形)
- poj 1095 递归(Catalan)
- poj 2083 Fractal 递归 图形打印
- poj 2083 Fractal 【递归打印字符】
- POJ 1095 Trees Made to Order 卡特兰数以及递归分治
- POJ 1747 Expression(找规律 递归)
- poj 3414 Pots(BFS+递归打印)
- POJ 1128 Frame Stacking(拓扑排序·打印字典序)
- POJ 1068(找规律)
- POJ 1240 Pre-Post-erous!(组合数学+递归)
- 剑指offer_面试题5_从尾到头打印链表(栈和递归实现)
- Lua递归打印斐波那契数列
- 蓝桥杯 2014_5 打印图形 递归
- 从头到尾打印链表(递归思想)
- 递归文件夹并树形打印 分类: Java 2015-01-22 21:52 217人阅读 评论(0) 收藏
- POJ 2965 The Pilots Brothers' refrigerator(dfs+枚举 || 规律)