题意:给你一个数N,你可以等概率的对N除以它自身的约数,即N%X==0 ,N=N/X ,次此为一次操作
一直对N进行此操作,直到N==1,求操作的期望次数
解法:此题为经典概率dp,
dp[i] 定义为:对 i 进行操作数次,使之变为1的操作次数期望值
而dp[i] 的值,可通过 i的约数状态进行逆向操作转移得到,即设 i 的n个约数分别为X0 , X1 , X2 …… Xn
那么
末尾的+1解释:该方程的意思是从 约数X转移到 i ,此时就进行了一次操作
通过左右乘以n,化解方程得:
预处理,即可
以dp[2]为例:
2有1/2的概率由1乘上2得来
也有1/2的概率由2乘上1得来
则加上各自概率乘以期望的值,由于此次操作一定发生则最后加上期望1
#include<bits/stdc++.h> using namespace std; int t; int n; double dp[100005]; int main() { for(int i=2;i<=100000;i++) { int cnt=0; double sum=0; for(int j=1;j<=sqrt(i);j++) { if(i%j==0) { cnt++; sum+=dp[j]; if(i/j!=j) { sum+=dp[(i/j)]; cnt++; } } } dp[i]=(sum+cnt)/(double)(cnt-1); sum+=dp[i]; } int tt=1; scanf("%d",&t); while(t--) { scanf("%d",&n); printf("Case %d: %.10lf\n",tt++,dp[n]); } }
Race to 1 Again 概率DP
最新推荐文章于 2023-03-29 10:28:27 发布