您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: