不知道为什么会有找规律这种nt题型。
首先每一秒都会发生
a
i
=
a
i
−
1
∣
a
i
∣
a
i
+
1
a_i = a_{i-1} | a_i | a_{i+1}
ai=ai−1∣ai∣ai+1,如果我们多写几步:
a
i
2
=
a
i
−
1
1
∣
a
i
1
∣
a
i
+
1
1
=
a
i
−
2
∣
a
i
−
1
∣
a
i
∣
a
i
−
1
∣
a
i
∣
a
i
+
1
∣
a
i
∣
a
i
+
1
∣
a
i
+
2
a_{i_2} = a_{i-1_1} | a_{i_1} | a_{i+1_1} = a_{i-2} | a_{i-1} | a_{i} | a_{i-1} | a_{i} | a_{i+1} | a_{i} | a_{i+1} | a_{i+2}
ai2=ai−11∣ai1∣ai+11=ai−2∣ai−1∣ai∣ai−1∣ai∣ai+1∣ai∣ai+1∣ai+2
那么也就是说, a n = a n − m ∣ … ∣ a n + m a_n = a_{n - m} | \dots | a_{n + m} an=an−m∣…∣an+m
所以只要求这一段的或运算和就行了,至于快速或运算的模版直接背下。
模版:
while(r > l){
l |= (l + 1);
}
CODE:
#include<bits/stdc++.h>
using namespace std;
void solve(){
int n,m;cin >> n >> m;
int l = max(0,n-m);
int r = n+m;
while(r > l){
l |= (l + 1);
}
cout << l << endl;
}
int main(){
int T;cin >> T;
while(T--){
solve();
}
return 0;
}