Find the probability of getting a 1–bit number ?
Find the probability of getting a 1-bit number after the following procedure is followed:
Initially a number x is chosen at random in a given range .After this we again choose a bit from x randomly?
Find the expected number of bit 1s if we randomly choose a number x in the given range?
Explanation
Input Format
The first line of input is the number of test cases T. Each test cases is a line contains 2 integers A and B separated by a space.
Output Format
For each test case output a line containing 2 float numbers separated by a space. The first one is the probability and the second one is the expected number. You should output the number accurate to 5 fractional digits.
Constraints
1 <= T <= 200
1 <= A <= B <= 10^10
Sample Input
1
2 4
Sample Output
0.61111
1.33333
Explanation
(10) (11) (100)
(1) So we got a one in :
(1/3)(1/2)+(1/3)(1/1)+(1/3)*(1/3)=(11/18)
(2) The expected 1 we have is
(1)(1/3)+(2)(1/3)+(1)*(1/3)=(4/3)
Time Limit:3.0 sec(s) for each input file.
Memory Limit:256 MB
Source Limit:1024 KB
SOURCE CODE ::
#include<bits/stdc++.h>
using namespace std;
#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)
#define ll long long
#define mygc(c) (c)=getchar_unlocked()
void reader(int *x)
{
int k,m=0;*x=0;
for(;;)
{
mygc(k);
if(k=='-')
{m=1;
break;
}
if('0'<=k&&k<='9')
{
*x=k-'0';
break;
}
}
for(;;)
{
mygc(k);
if(k<'0'||k>'9')
break;
*x=(*x)*10+k-'0';
}
if(m)(*x)=-(*x);
}
void reader(ll *x)
{
int k,m=0;*x=0;
for(;;){mygc(k);if(k=='-'){m=1;break;}if('0'<=k&&k<='9'){*x=k-'0';break;}}
for(;;){mygc(k);if(k<'0'||k>'9')break;*x=(*x)*10+k-'0';}if(m)(*x)=-(*x);
}
int T;
ll A, B;
ll cnt(ll A){
ll p, all, rest;
ll res = 0;
for(p=1;;p*=2){
if(A < p) break;
all = (A/(2*p));
rest = (A%(2*p));
res += all * p;
if(rest >= p) res += rest - p;
}
return res;
}
ll cntRange(ll A, ll B){
return cnt(B+1) - cnt(A);
}
int main(){
int i, j, k;
ll st, ed, dig, r, tmp;
double res1, res2;
reader(&T);
while(T--){
reader(&A);
reader(&B);
res1 = res2 = 0;
st = ed = dig = 1;
for(;;){
if(st > B) break;
if(max(st,A) <= min(ed,B)){
tmp = cntRange(max(st,A), min(ed,B));
r = min(ed,B) - max(st,A) + 1;
res1 += tmp / (double)dig;
res2 += tmp;
}
st = st*2;
ed = st*2-1;
dig++;
}
res1 /= (B-A+1);
res2 /= (B-A+1);
printf("%.5f %.5f\n",res1,res2);
}
return 0;
}
OUTPUT : :
1 2 4 0.61111 1.33333