题目大意:
给你k个方案数,让你构树
每个点有白色和黑色
并且如果树上有个点是黑色的那么它的子树也是黑色的
给出符合要求有k中方案的树
思路:
emmm这题就是找规律?
最后得出来的规律是 一个点的方案数=(它所有的子树方案数的累乘+1)
然后如果是没有子树的点那么它的方案数就是2
有结论我们就可以构造了
如果是目前方案数是奇数
我们就拆成两个子树,方案数就变一半了
因为有一个子树是单独一个点,而该点的方案数就是2
对另一个子树再进行相同操作
如果目前方案数是偶数的
我们就让他连上一个点,让他变成奇数,这时候方案数-1
(因为子树就一个嘛,子树累乘+1就是方案数)
之后代码就出来啦
AC代码:
#include <bits/stdc++.h>
using namespace std;
pair<int,int>a[100010];
int ans=0;
int cnt=1;
int main()
{
long long k=0;
cin>>k;
while(k){
if(k==2)break;
if(k==3){
a[++ans]={cnt,cnt+1};
cnt++;
break;
}
if(k&1){
a[++ans]={cnt,cnt+1};
a[++ans]={cnt,cnt+2};
cnt+=2;
k=k/2;
continue;
}
a[++ans]={cnt,cnt+1};
cnt++;
k--;
}
cout<<cnt<<endl;
for(int i=1;i<=ans;i++){
cout<<a[i].first<<' '<<a[i].second<<endl;
}
return 0;
}