Race to 1 Again : Solution
আমরা ৬ এর জন্য Expected Value বের করবো.
ধরি, Expected Value হচ্ছে E. এবং ৬ এর divisor গুলা হলো : [১, ২, ৩, ৬] = মোট ৪টি।
৬ কে তার যেকোনো একটা divisor দিয়ে ভাগ দেয়ার probability = ১/৪
ভাগ দেওয়ার পর নতুন সংখ্যাটি = ৬/divisor [যদি ৩ দিয়ে ভাগ দেয় , নতুন সংখ্যা = ৬/৩ = ২]
এখানে,
base case হচ্ছে, E(1) = 0.
তাহলে ৬ এর জন্য Expected Value কে লেখা যায়,
E(6) = (1/4)*( E(6/1) + 1 ) + (1/4)*( E(6/2) + 1 ) + (1/4)*( E(6/3)
+ 1) + (1/4)*( E(6/6) + 1)
E(6) = (1/4) * ( E(6) + 1 + E(3) + 1 + E(2) + 1 + E(1) + 1 )
4*E(6) = E(6) + E(3) + E(2) + 4
3*E(6) = E(3) + E(2) + 4
এখানে ৩ এর divisor গুলা হলো : [১, ৩] = মোট ২টি, তাই
E(3) = (1/2) * ( E(3/1) + 1) + (1/2) * (E(3/3) + 1 )
E(3) = (1/2) * ( E(3) + 1 + E(1) + 1 )
2*E(3) = E(3) + E(1) + 2
E(3) = E(1) + 2
E(3) = 2
আবার ২ এর divisor গুলা হলো : [১, ২] = মোট ২টি, তাই
E(2) = (1/2) * ( E(2/1) + 1) + (1/2) * (E(2/2) + 1 )
E(2) = (1/2) * ( E(2) + 1 + E(1) + 1 )
2*E(2) = E(2) + E(1) + 2
E(2) = E(1) + 2
E(2) = 2
সুতরাং লিখা যায়.
E(6) = (2 + 2 + 4) / 3
যদি ভালো করে খেয়াল করো তাহলে দেখবে ,
E(6) = ( divisor_of(3) + divisor_of(2) + divisor_of(6) ) / (divisor_of(6) - 1 )
Coding Part :
#include<bits/stdc++.h>
#define ld long double
#define N 100000
using namespace std;
vector<int>d[N+5];
ld dp[N+5];
void divisor()
{
for(int i=1;i<=N;i++)
{
for(int j=i;j<=N;j+=i)
d[j].push_back(i);
}
}
ld expected_value(int n)
{
if(n == 1)
return 0;
if(dp[n] >= 0)
return dp[n];
int cnt = d[n].size();
dp[n] = cnt;
for(int i=0;i<cnt-1;i++)
dp[n] += expected_value(d[n][i]);
dp[n] = dp[n]/(cnt-1);
return dp[n];
}
int main()
{
int t, k = 1;
cin >> t;
for(int i=0;i<=N;i++)
dp[i] = -1;
divisor();
while(t--)
{
int n;
cin >> n;
cout << showpoint << fixed << setprecision(7);
cout << "Case " << k++ << ": ";
cout << expected_value(n) << "\n";
}
return 0;
}
Comments
Post a Comment