首先也是先想到题解的 $\frac{2n}{3}$ 做法,就是找到一个 $a+b=c$,那么每次可以把 $c$ 替换成 $a+b$,以至于每次多出一个。但是由于我们没用充分利用替换后的 $a,b$,它们替换之后就没有任何作用了。
所以考虑一种这种递归形状:

这种结构利用了 $2n-1$ 个元素,实现了 $n-2$ 层递归,然后在开头加一个 $1+2+3+4+7+9-10=16$ 就可以刚好利用 $2n$ 个元素凑成刚好 $n-1$ 层。
同时需要满足剩下的那个元素不能和之前的元素相同,而且开始递归的数要足够大,并且要保证最后减出来的数要不超过 $10^9$。,大概是根号级别的,打一下表发现 $520520$ 这个数就满足条件。
然后注意 $n\le 3$ 的时候要特判一下。构造是线性的。
然后就有:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int num=520520,n;
ll sum;
vector<int>ans,tmp;
unordered_map<int,bool>mp;
int main(){
cin>>n;
if(n==2) cout<<"1 2 3 4\n1\n2 1 4\n2 2 3\n";
else if(n==3) cout<<"5 2 4 3 1 7\n2\n2 7 4\n4 1 3 2 5\n4 1 3 2 5\n2 7 4\n";
else{
int now=1,x=num;
for(int i=1;i<n;i++){
sum+=x;
x-=now;
ans.push_back(x);
ans.push_back(now);
now++;
}
ans.push_back(num);
ans.push_back(sum-num);
for(int v:ans) cout<<v<<' ';
cout<<'\n';
cout<<n-1<<'\n';
tmp.push_back(sum-num);
tmp.push_back(num);
now=1;
for(int i=2;i<=n;i++){
cout<<i<<' ';
for(int v:tmp) cout<<v<<' ';
cout<<'\n';
mp.clear();
for(int v:tmp) mp[v]=1;
cout<<2*n-i<<' ';
for(int v:ans){
if(!mp.count(v)) cout<<v<<' ';
}
cout<<'\n';
if(i==n) break;
int x=tmp.back();
tmp.pop_back();
tmp.push_back(now),tmp.push_back(x-now);
now++;
}
}
return 0;
}