LightOJ-1038-Race to 1 Again(概率dp)

来源:互联网 发布:梦幻之星新星捏脸数据 编辑:程序博客网 时间:2024/06/05 01:05

题目链接:LightOJ-1038-Race to 1 Again

dp[i] 为从 i1 的期望。
因为从 n 转移到它的所有因子的概率相等,设num 为i的因子个数,因此有:

dp[i]=1+j|iidp[j]num

化简得:
dp[i]=i1j|idp[j]+numnum1

dp搞一搞就行,复杂度为 O(n1.5)

#include<bits/stdc++.h>using namespace std;double dp[100007];void init(int n){    dp[1]=0;    for(int i=2;i<=n;i++)    {        double sum=0;        int num=0;        for(int j=1;j*j<=i;j++)        {            if(i%j) continue;            if(j*j==i) sum+=dp[j],num++;            else sum+=dp[j]+dp[i/j],num+=2;        }        dp[i]+=(sum+num)/(num-1);    }}int main(){    init(100000);    int T;    scanf("%d",&T);    for(int i=1;i<=T;i++)    {        int n;        scanf("%d",&n);        printf("Case %d: %.15f\n",i,dp[n]);    }}
0 0