题意
有一个数 D D 每次除以他的一个因数得到一个新的 ,问 D D 变成1的次数的期望
题解
为
i
i
的约数
为
i
i
的约数()
约数个数−1约数个数dp[i]=dp[k]+约数个数约数个数k
约
数
个
数
−
1
约
数
个
数
d
p
[
i
]
=
d
p
[
k
]
+
约
数
个
数
约
数
个
数
k
为
i
i
的约数()
dp[i]=dp[k]+约数个数约数个数−1k
d
p
[
i
]
=
d
p
[
k
]
+
约
数
个
数
约
数
个
数
−
1
k
为
i
i
的约数()
代码
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100010
int n,T;
double dp[N];
int main(){
scanf("%d",&T);
dp[1]=0;
for(int i=2;i<=100000;i++){
int num=0;
for(int j=1;j<=sqrt(i);j++){
if(i%j==0){
dp[i]+=dp[j];num++;
if(i/j!=j) dp[i]+=dp[i/j],num++;
}
}
dp[i]=(dp[i]+num)/(num-1);
}
for(int tt=1;tt<=T;tt++){
scanf("%d",&n);
printf("Case %d: %lf\n",tt,dp[n]);
}
return 0;
}