看了题解,我的思路和其他人的差距都很大,但是不知道为什么WA了4个点,就很奇怪。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll f[31];
ll tree[10000010];
void dfs(ll v,ll i,ll n)
{
if(i==0||n==0)
{
return;
}
ll sum=0,summ=0;//cout<<v<<" "<<i<<" "<<n<<endl;
for(int j=0;j<=i;j++)
{
sum+=f[j]*f[i-j];//cout<<sum<<endl;
summ+=f[j];
if(sum>=n)
{
//cout<<endl<<v<<" "<<j<<" "<<i<<" "<<sum<<" "<<summ-f[j]<<endl;
tree[v*2]=j;
dfs(v*2,j-1,n-(sum-f[j]*f[i-j]));
tree[v*2+1]=i-j;
dfs(v*2+1,i-j-1,n-(sum-f[j]*f[i-j]));
return;
}
}
}
void dfs2(int v)
{
//cout<<tree[v]<<" "<<v<<endl;
if(tree[v])
{
putchar('(');
dfs2(v*2);
putchar('X');
dfs2(v*2+1);
putchar(')');
}
}
int main()
{
//freopen("TREE.in","r",stdin);
//freopen("TREE.out","w",stdout);
f[0]=1;
f[1]=1;
for(int i=2;i<=30;i++)
{
for(int j=0;j<i;j++)
{
f[i]+=f[j]*f[i-j-1];
}
//cout<<f[i]<<endl;
}
ll n;
cin>>n;
n++;
ll x=0;
for(int i=0;i<=30;i++)
{
x+=f[i];
if(x>=n)
{
tree[1]=i;
dfs(1,i-1,n-(x-f[i]));
dfs2(2);
putchar('X');
dfs2(3);
return 0;
}
}
return 0;
}