题目大意:给出一个数D,每次可以选择数D的一个因子,用数D除上这个因子得到一个新的数D,为数D变为1的操作次数的期望为多少?
题解:对于一个数i,假设x1,x2......都是i的因子,num为因数个数
那么
(i也是i的因数)
并且dp[1]=0
两边都有dp[i]
式子右边分母上的dp之和是不包括dp[i]的,而num却包含了i(i也算一个因子)
注意在算的时候 j必须循环到sqrt(i)如果循环到i的话会T掉
#include <bits/stdc++.h>
using namespace std;
#define maxn 100010
typedef long long ll;
int n;
double dp[100010];
int main()
{
//freopen("input.txt","r",stdin);
dp[1]=0;
dp[2]=2;
for(int i=3; i<=maxn; ++i)
{
int sqr=sqrt(i);
int num=2;//1和i
//dp之和不算i,而dp[1]=0所以没必要算,j就从2开始循环
double sum=0;
for(int j=2; j<=sqr; ++j)
if(i%j==0)
{
if(j*j==i)
{
sum+=dp[j];
num+=1;
}
else
{
sum+=dp[j];
sum+=dp[i/j];
num+=2;
}
}
dp[i]=(1+sum)/(num-1);
dp[i]+=1;
}
int T;
cin>>T;
for(int cas=1; cas<=T; ++cas)
{
cin>>n;
printf("Case %d: %.7f\n",cas,dp[n]);
}
return 0;
}