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");
}