题目链接:LightOJ-1038-Race to 1 Again
设
dp[i]
为从
i
到
因为从
n
转移到它的所有因子的概率相等,设
dp[i]=1+∑j|iidp[j]num
化简得:
dp[i]=∑i−1j|idp[j]+numnum−1
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]);
}
}