思路: 任意一个2的幂次大小的n最后都可以只剩下一个数字; 例如1 2 3 4 5 6 7 8: 1 2;3,4;5,6;7,8 这样就剩下4个不同的数:1 1 2 2 3 3 4 4; 再1 3;2 4;5 7;6 8就剩下2个不同的数了:1 1 1 1 2 2 2 2 。 那么我们将n用最小的两个2幂次覆盖,然后递归的处理即可。
#pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc++.h> using namespace std; typedef long long LL; const int N = 2e5 + 10; #define fi first #define se second #define pb push_back #define wzh(x) cerr<<#x<<'='<<x<<endl; int n; vector<pair<int,int>>v; void gao(int l,int r){ if(l>=r)return; int mid=l+r>>1; gao(l,mid); gao(mid+1,r); for(int i=l,j=mid+1;i<=mid&&j<=n;i++,j++)v.emplace_back(i,j); } int main() { ios::sync_with_stdio(false); cin>>n; int p=1; for(;p<=n;p*=2);p/=2; gao(1,p); gao(n-p+1,n); cout<<v.size()<<'\n'; for(auto k:v)cout<<k.fi<<' '<<k.se<<'\n'; return 0; }