概率DP light oj 1038

时间:2022-04-15 16:04:06

t个数据

然后一个n

输出变成1的期望

看个数据

dp[n]代表n变成1的期望

cnt代表因子个数 pi代表因子

那么dp[n]=1/cnt*(dp[n/p1]+1)+1/cnt*(dp[n/p2]+1)...

为什么加1呢    就是走到这个数要加一步

整理可得dp[n]=1/(cnt-1)(dp[n/p1]+dp[n/p2]...+cnt);

 #include <stdio.h>
#include<algorithm>
#include<math.h> using namespace std; #define MAXN 100010 double dp[MAXN]; int main()
{
int t,ca;
scanf("%d",&t);
ca=;
dp[]=; for(int i=;i<=;i++)
{
double en=sqrt(1.0*i);
int cnt=;
dp[i]=; for(__int64 j=;j<=en;j++)
{
if(i%j==)
{
if(i/j==j) //去一下同样的
{
cnt++;
dp[i]+=dp[j];
}
else
{
cnt+=;
dp[i]+=dp[i/j];
dp[i]+=dp[j];
}
}
}
dp[i]=(dp[i]+cnt)/(cnt-);
} while (t--)
{
int n;
scanf("%d",&n);
printf("Case %d: %.6lf\n",ca++,dp[n]);
} return ;
}