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;
}
相关文章推荐
- 【LightOJ 1038】Race to 1 Again(概率DP求期望)
- LIghtOJ1038---Race to 1 Again(概率dp)
- LightOJ 1038-Race to 1 Again(概率dp)
- LightOJ 1038 Race to 1 Again【概率DP】
- [LightOJ1038] Race to 1 Again
- LightOJ - 1038 Race to 1 Again 递推+期望
- lightoj1038 - Race to 1 Again(期望DP)
- LightOJ 1038 Race to 1 Again (概率DP,记忆化搜索)
- lightoj 1038-Race to 1 Again 期望类DP
- lightoj 1038 - Race to 1 Again 【概率dp】
- LightOJ 1038 Race to 1 again 期望+概率dp
- LightOJ 1038 Race to 1 Again (约数+期望)
- LightOJ 1038 Race to 1 Again
- 【概率DP】 LightOJ 1038 Race to 1 Again
- LightOJ 1038 Race to 1 Again(概率期望DP)
- lightoj1038 - Race to 1 Again(概率DP)
- LightOJ 1038 Race to 1 Again
- lightoj 1038 - Race to 1 Again
- LightOJ 1038 Race to 1 Again 期望 记忆化dp
- LightOJ1038---Race to 1 Again (概率dp(基础))