代码:
#include<cstdio>
using namespace std;
int far[(int)1e5+10],value[(int)1e5+10],tot;
void dfs(int ind,int k)
{
if(k==1)
{
value[ind]=1;
return;
}
if(k&1)
{
int son1=++tot,son2=++tot;
dfs(son1,2);
dfs(son2,(k-1)/2);
far[son1]=far[son2]=ind;
value[ind]=value[son1]+value[son2];
}
else
{
int son=++tot;
dfs(son,k-1);
far[son]=ind;
value[ind]=value[son];
}
}
int main()
{
int k;
scanf("%d",&k);
if(k==1)
{
printf("2\n1\n1 2");
return 0;
}
tot=1;
dfs(1,k);
printf("%d\n",tot);
for(int i=2;i<=tot;++i)
{
printf("%d ",far[i]);
}
putchar('\n');
for(int i=1;i<=tot;++i)
{
printf("%d ",value[i]);
}
return 0;
}
蔡弈文
全部评论