Problema:
Il Comitato Oscar vuole decidere quale persona dovrebbe ottenere il premio come miglior attore tra gli attori N. Per questo ha deciso di utilizzare una funzione casuale random_bit () che restituisce 0 o 1 con eguale probabilità. Perché i risultati siano equi, al comitato è stato chiesto di generare un numero casuale compreso tra 1 e N (inclusi), tale che tutti gli attori hanno la stessa probabilità di essere scelti (che in questo caso dovrebbe essere sempre uguale a 1 / N.
Prima di tutto il Comitato vuole sapere il numero atteso di volte in cui dovranno chiamare la funzione random_bit () per generare un numero casuale compreso tra 1 e N.Also, mentre chiamano la funzione, dovrebbero seguire la strategia ottimale (es. strategia che minimizza il numero previsto di chiamate di funzione)
Questo è un problema dei precedenti concorsi su codechef.com e il link ad esso.
Questo sito consente di vedere la soluzione di altri utenti e finora è stata accettata solo una soluzione. La soluzione è in codice C ++:
#include <iostream>
using namespace std
int main() {
int T;
cin >> T;
for(int ii = 0; ii<T; ++ii)
{
int N;
cin >> N;
double p = 1, ans = 0;
int x = 1 % N;
for(int i = 0; i<100000; ++i)
{
ans += x * p;
x = (x * 2) % N;
p /= 2;
}
cout << ans;
}
return 0;
}
So come funziona il codice e cosa fa, ma non riesco a trovare la logica dietro. Qualsiasi aiuto / indizio?
Sarebbe anche bello se qualcuno potesse pubblicare un altro algoritmo.