Description
给定两个整数 (n) 和 (m),(n+m le 10^6),将 ({ 0,1,2,...,n-1 }) 和 ({ m,m+1,...,m+n-1 }) 一一匹配成 (n) 对数,对于每对匹配的 (x in A) 和 (y in B),都要满足 (x subseteq y)。容易证明这样的解一定存在。
Solution
对于集合 (A) 中的数,我们从大到小考虑,每个数找到一个最小的与它匹配的,那么往下的一段一定可以与它下面的数匹配,并且会占用掉所有小于该数的数……这样说好像有点抽象,来一张图感受一下
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
int n,m;
signed main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
while(n)
{
int x=n-1,y=m;
while((x&y)!=x) ++y;
for(int i=y;i>=m;--i,--x) cout<<x<<" "<<i<<endl;
n=x+1; m=y+1;
}
system("pause");
}