- 各桁のビットに着目して解いていく
- 各桁ごとにビットが立つ確率を求め、それらを2^i倍して足していけば良い
- 答えが合わずに困ってたら、1〜nまでで考えていたのが原因だった。本当は0〜n-1
- G++で提出したらWA、C++だとACだった。やっぱり納得が行かない。
int countBits(int n, int s)
{
int result = n / (1 << (s + 1)) * (1 << s);
int rest = n % (1 << (s + 1)) - (1 << s);
if (rest < 0) {
rest = 0;
}
return result + rest;
}
int main() {
int k;
cin >> k;
for (int i = 0; i < k; ++i) {
double sum = 0;
int n;
cin >> n;
for (int bit = 0; bit < 31; ++bit) {
double p = countBits(n, bit) / (double)n;
p = 2.0 * p * (1.0 - p);
p *= (1 << bit);
sum += p;
}
printf("%.5lf\n", sum);
}
}