問題
http://community.topcoder.com/stat?c=problem_statement&pm=11552&rd=14544
正の整数AとBが与えられる。
AからBを得るには、2進数で表わされたAから各ビットを返していく。
この操作を行ったとき、途中で現れる最大の数を求める。
解き方
A,Bは最大10^18のため単純なシミュレーションでは解くことができない。
そのため、計算量を削減する法則がないか考える。
2進数にしてみて、最初と最後の状態までのプロセスの変化が答えに関連しないか考えてみる。
いくつか例を出してみると、
一度も触ったことがないビットは固定しなければいけないが
「AからBを得るときに1度でもひっくり返したビット以降はすべて1」にできることがわかる。
コード
class BinaryCards {
public: long long largestNumber(long long A, long long B) {
for(long long i=63;i>=0;i--){
long long x=1LL<<i;
if((A&x)!=(B&x))return A | ( (1LL<<(i+1))-1);
}
return A;
}
};
public: long long largestNumber(long long A, long long B) {
for(long long i=63;i>=0;i--){
long long x=1LL<<i;
if((A&x)!=(B&x))return A | ( (1LL<<(i+1))-1);
}
return A;
}
};