1'den 100'e kadar numaralandırılmış bir dizi disk bir sıra halinde rastgele sıralanıyor.
Tam olarak 22 asal sayılı diskin doğal konumlarından başka yerde bulunacak şekilde kısmi bir bozulmayla sıralanması olasılığı nedir? (Asal sayılı olmayan disklerin herhangi bir kısmı kendi doğal konumlarında veya konumlarının dışında bulunabilir.)
Cevabınızı 0, abcdefghijkl şeklinde 12 ondalık basamağa kadar yuvarlayarak verin.
Cevap: 0.001887854841
C++:
public class Euler239 { public static void main(String[] args) { double[][] dp = new double[102][102]; // dp[n][m] has the following meaning: // we need to put n+m items in a permutation // each of n items has one place on which it can't be put // m items can be put anywhere for (int n = 0; n <= 100; ++n) { for (int m = 0; m <= 100; ++m) { if (n == 0) dp[n][m] = 1; else { dp[n][m] = dp[n-1][m]*m/(n+m); if (n > 1) dp[n][m] += dp[n-2][m+1]*(n-1)/(n+m); } } } double res = 0; Sieve sieve = new Sieve(101); for (int i = 1; i <= 100; ++i) if (sieve.isPrime(i)) { for (int j = i+1; j <= 100; ++j) if (sieve.isPrime(j)) { for (int k = j+1; k <= 100; ++k) if (sieve.isPrime(k)) { res += dp[22][75]/(100*99*98); } } } System.out.println(res); } }
Maple:
d:=n->(-1)**n*sum((-1)**k*binomial(n,k)*k!,k=0..n); # permutation with no fixed point phi:=proc(k,n) option remember;if k=n then d(k) elif k=1 then n-1 else phi(k,n-1)+k*phi(k-1,n-1) fi end: #injection from [1,k] to [1,n] evalf(binomial(25,3)*phi(22,97)*75!/100!,20);
Mathematica:
h[n_,0]=n!; h[n_,1]=(n-1)(n-1)!; h[n_,p_]:=h[n-1,p-1](n-p)+Sum[h[n-p+i,i](p-1)!/i!(n-p+1),{i,0,p-2}] Table[h[75+i,i]=h[75+i,i];,{i,0,22}]; SetAccuracy[(h[97,22]Binomial[25,3])/100!,13]
Python:
import math #using third-party memorize technology(thanx to x10) class memoize(object): def __init__(self,fun): self.memory={} self.fun=fun def __call__(self,*args): if args in self.memory: return self.memory[args] r=self.fun(*args) self.memory[args]=r return r def isprime(x) : if x <= 1 : return False if x < 4 : return True if x % 2 == 0 : return False if x < 9 : return True if x % 3 == 0 : return False r = int(math.sqrt(x)) f = 5 while f <= r : if x % f == 0 : return False if x % (f+2) == 0 : return False f += 6 return True @memoize def calc(p, n, hit) : if p <= 0 : if hit == 0 : return 1.0 else : return 0.0 # disk in empty place pr = (n - p) / n * calc(p-1, n-1, hit) # disk in allowed position if p > 1 : pr += (p - 1) / n * calc(p-2, n-1, hit) # disk in its native position if hit > 0 : pr += 1 / n * calc(p-1, n-1, hit - 1) return pr pr = [x for x in range(100+1) if isprime(x)] pc = len(pr) print calc(pc, float(100), pc - 22)C#:
// compute C(multiple,k) static long Binomial(long n, long k) { checked { if (k > n) return 0; if (k > n / 2) k = n - k; // faster long accum = 1; for (long i = 1; i <= k; i++) accum = accum * (n - k + i) / i; return accum; } } static public void Run(bool sample) { checked { double p = 0; for (int j = 1; j <= 22; ++j) { double d = (double)Binomial(22, j); for (int k = 1; k <= j; ++k) d /= 98 - k; if ((j & 1) == 0) p -= d; else p += d; } Console.WriteLine("{0}=0.001887854841", Binomial(25, 3) * (1 - p) / (100 * 99 * 98)); }
Haskell:
numWays n 0 = factorial n numWays n 1 = (n-1) * factorial (n-1) numWays n d = ((d-1) * numWays (n-1) (d-2)) + ((n-d) * numWays (n-1) (d-1)) p239 = (fromIntegral (25 `choose` 22) * (numWays 97 22)) / (factorial 100)