Product of Closures
Mier_Samuelle · · 题解
有点好玩。但是做了 1.5h,我是区。
要求的是字典序最小,那越高的位就要越小。由定义知
假设
例如
我们发现,对于
这样我们就解决了
第一种,只有一个二的次幂可以取(记为
第二种,没有任何二的次幂可以取。此时
做完了。很多结论我没有严格证明,建议自己多手玩几个例子来理解。
:::success[Code]{open}
#include <bits/stdc++.h>
using namespace std;
void output(int a, int b, int n){
int lena = __lg(a) + 1, lenb = __lg(b) + 1;
for (int i = 0; i < n; i++){
int da = (a >> (lena - i % lena - 1) & 1);
int db = (b >> (lenb - i % lenb - 1) & 1);
cout << (da & db);
}
cout << "\n";
return;
}
void solve(){
int l, r, n;
cin >> l >> r >> n;
int k;
for (k = 0; (1 << (k + 1)) <= r; k++);
int a = (1 << k), b = (1 << (k - 1));
if (a >= l && b >= l){
output(a, b, n);
}
else if (a >= l){
b = (a == l ? l + 1 : l);
output(a, b, n);
}
else{
a = l;
int p = __lg(l ^ r);
b = (r >> p) << p;
output(a, b, n);
}
return;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--){
solve();
}
return 0;
}
:::