プロジェクトオイラーの問題323

トピックリンク

一見すると、この質問は少し、実際には、確率分布と関連トピックを計算しています。

そこY0、Y1、Y2シリーズ32ビット符号なし数
xが最初に0、次に直列及び排他的論理和演算の数、動作N倍であり、xが2 ^ 32-1になるまで、実際には、全てのビットが1×であるが。
N需要の期待。

期待を計算する方法は?
各nについて確率p(n)は、その後、加重和に対応する算出されます。
現在、1つの分析ずつ見て
、次にY0毎のビットが1であることを、確率は1 /(2 ^ 32)であり、nが1であり
、N 2は、最初のビットは、各ビットについて計算し、結果は確率であります1マイナス確率が1でない、確率は1でない最初のビットが0でない場合、第1のビットY0 Y1が0ではない確率は、P(2)=(1-1次に、1 /(2 ^ 2)であります/(2 ^ 2))^ 32 - P(1)
Nは、p、3(3)=( 1-1 /(2 ^ 3))^ 32 - P(1) - P(2)
そう
トピック10進後* P(N)、すなわち、P(n)が小さい場合、結果は、n乗算することによって影響されない、10 ^を必要N未満10以上です。

私は、分子と分母に保存されたデータ構造の確率の計算を行うと。私は確率を保存するために二重の直接の使用を感じ、他人の分析を見て、出てきた答えが正しい答えを与えることができた後、私は不明、しようとしませんでした。
ここに私のコードは次のとおりです。

      
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
      
      
パブリック クラス
{
公共 のBigInteger [分子{ 取得します セット ; }
公共 のBigInteger分母{ 取得します セット ; }
パブリックのBigInteger分子、分母のBigInteger
{
分母=分子;
分母=分母。
}
ビッグボックス   オイラープロジェクト323タイトル =「行」>}
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");
}

おすすめ

転載: www.cnblogs.com/lijianming180/p/12302572.html