您的位置:首页 > 大数据 > 人工智能

LightOJ1038-Race to 1 Again

2017-04-27 16:27 232 查看


Race to 1 Again

 

题意:任何一个大于1的整数,经过若干次除以自己的因子之后可以变为1,求该变换字数的数学期望值。

解题思路:d[i] 代表从i除到1的期望步数;那么假设i一共有c个因子(包括1和本身)

d[i] = ( d[1] + d[a2] + d[a3] + d[a4] ..... + d[i] + c) / c; 化简后:( (c - 1) / c ) * d[i] =  ( d[1] + d[a2] + d[a3] + d[a4] ..... + d[ac- 1]  + c) / c。那么d[i]就等于所有因子的期望和加上c再除以c-1。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <vector>
#include <set>
#include <bitset>
#include <stack>
#include <map>
#include <climits>
#include <functional>

using namespace std;

#define LL long long
const int INF=0x3f3f3f3f;
const double eps=1e-8;

double dp[100009];

void init()
{
dp[1]=0;
for(int i = 2; i <= 100005; i++)
{
double sum=0;
int cnt=0;
for(int j=1;j*j<=i;j++)
{
if(i%j==0)
{
cnt++;
sum+=dp[j];
if(j*j!=i)
{
cnt++;
sum+=dp[i/j];
}
}
}
dp[i]=1.0*(sum+cnt)/(cnt-1);
}
}

int main()
{
int t,n,cas=0;
init();
scanf("%d", &t);
while(t--)
{
scanf("%d",&n);
printf("Case %d: %.10lf\n",++cas,dp
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: