public
class
{
public BigInteger Numerator {
get;
set; }
public BigInteger Denominator {
get;
set; }
public (BigInteger numerator, BigInteger denominator)
{
Numerator = numerator;
Denominator = denominator;
}
public static string GetAnswer()
{
List<Probability> probabilities =
new List<Probability>();
probabilities.Add(
new Probability(
0,
1));
BigInteger twoPow32 = BigInteger.Pow(
2,
32);
for (
int i =
1; ; i++)
{
BigInteger baseDenominator = BigInteger.Pow(
2, i);
BigInteger baseNumerator = baseDenominator -
1;
BigInteger lastBaseDenominator = BigInteger.Pow(
2, i -
1);
BigInteger lastBaseNumerator = lastBaseDenominator -
1;
BigInteger denominator = BigInteger.Pow(baseDenominator,
32);
BigInteger numerator = BigInteger.Pow(baseNumerator,
32);
BigInteger lastNumerator = BigInteger.Pow(lastBaseNumerator,
32);
probabilities.Add(
new Probability(
numerator - lastNumerator * twoPow32,
denominator));
if (probabilities[i].Denominator / probabilities[i].Numerator / i > BigInteger.Pow(
10,
12))
{
break;
}
}
BigInteger ansDenominator = probabilities.Last().Denominator;
BigInteger ansNumerator =
0;
for (
int i =
1; i < probabilities.Count; i++)
{
Probability current = probabilities[i];
BigInteger times = ansDenominator / current.Denominator;
ansNumerator += times * current.Numerator * i;
}
BigInteger times11 = ansNumerator *
100000000000 / ansDenominator;
double answer = (
double)times11 /
100000000000;
return answer.ToString(
"N10");
}