题目链接:传送门
思路:
画出2~9的树的构造形状;可以发现,①如果k为奇数,就给当前节点增加左右孩子,同时k/2。②如果n是偶数,就给当前节点增加一个孩子,同时k-1。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5+10;
int a[N][2],tot = 0;
int main(void)
{
ll k;
scanf("%lld",&k);
int pre = 1;
while(k > 3){
if(k&1){ //奇数
tot++;
a[tot][0] = pre;
a[tot][1] = tot+1;
tot++;
a[tot][0] = pre;
a[tot][1] = tot+1;
pre = tot+1;
k /= 2;
}
else{ //偶数
tot++;
a[tot][0] = pre;
a[tot][1] = tot+1;
pre = tot+1;
k--;
}
}
if(k == 3){
tot++;
a[tot][0] = pre;
a[tot][1] = tot+1;
}
printf("%d\n",tot+1);
for(int i=1;i<=tot;i++){
printf("%d %d\n",a[i][0],a[i][1]);
}
return 0;
}