#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll N = 1e6 + 10, M = 1e12 + 10;
ll t, w, f[N], ind = 4, sum[N];
// 这是从他人那抄下来的函数
int ff(ll x) {
if (x <= 3) {
return 3;
}
if (x < 6) {
return 4;
}
long long cnt = 6;
int ans = 5;
while (cnt < x) {
cnt *= 2, ans++;
}
return ans - 1;
}
int main() {
cin >> t;
f[1] = 0, f[2] = 1, f[3] = 2, f[4] = 3;
while (f[ind] < M)f[++ind] = f[ind - 1] * 2;
for (int i = 1; i <= ind; i++)sum[i] = sum[i - 1] + f[i];
for (int i = 3; i < 1e5; i++) {
int ans = lower_bound(sum + 1, sum + ind + 1, i) - sum;
int tmp = ff(i);
// cout << "test:" << i << "ans1: " << ans << " ans2: " << tmp << '\n';
if (ans != tmp)cout << "test" << i << "wrong !!!!" << '\n';
}
while (t--) {
cin >> w;
int ans = lower_bound(sum + 1, sum + ind + 1, w) - sum;
cout << ans << '\n';
}
}
我在本地测试了w为1到1e5内的答案,和别人的ac答案比对,并没有发现区别,但是在洛谷上提交就会输出"t"造成错误