ABC083 C - Multiple Gift
目次
# 問題
https://atcoder.jp/contests/abc083/tasks/arc088_a
を満たす2つの整数が与えられます.
要素がX以上Y以下(①)で、かつ前の要素の倍数で(②)前の要素よりも大きい(③)数列の最大長を求める問題です.
- - ①
- - ②
- - ③
# 入力
X Y
# 出力
N
# 入出力例
3 20
3
数列となり長さはです.
# 解説
次の要素は必ず倍数になっていてより大きい数です.
倍数は無数にありますが、目的は数列の長さを長くすることなのでその中でも一番小さい要素を次の要素とするのが良いです.
後ろにより多くの要素を詰めることが出来るからです.
一番小さい倍数は2倍したものです.
が一番小さい要素なので、から開始してを超えるまで何回2倍することが出来るかをカウントすれば答えが求まります.
これは次に見るように対数時間で高速に計算できるので十分間に合います.
が大きいのでオーバーフローには気をつける必要があります.
# 計算量
からまで進めるために2倍ずつ進んでいけば距離は1度進むごとにになっていきます.
最大で回進めば答えが出ます.
# 解答
#define Int long long
#define MAX_X 1000000000000000000
Int X, Y;
void input() {
cin >> X >> Y;
}
void solve() {
int count = 0;
Int x = X;
while (x <= Y) {
count++;
x *= 2;
}
cout << count << endl;
}
int main() {
input();
solve();
return 0;
}