链接:点击打开链接
题意:给出一个数n,每次可以将n除以自己的因子变成一个新的数,问将n变成1的次数的期望
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
double dp[100005];
int main(){
int t,n,i,j,cas,num;
double sum;
for(i=0;i<=100000;i++) //设dp[i]为i变到1的期望
dp[i]=0; //那么根据期望从后往前推
for(i=2;i<=100000;i++){ //则dp[i]=(dp[1]+dp[c1]+...+dp[i]+num)/num
num=2,sum=dp[1]; //num为因子个数,ci为i的因子
for(j=2;j*j<=i;j++){ //化简后则dp[i]=(dp[1]+dp[c1]+...+dp[cnum]+num)/(num-1)
if(i%j==0){
num++;
sum+=dp[j];
if(j*j!=i){
num++;
sum+=dp[i/j];
}
}
}
dp[i]=(sum*1.0+num)/(num-1);
}
scanf("%d",&t);
for(cas=1;cas<=t;cas++){
scanf("%d",&n);
printf("Case %d: %.7lf\n",cas,dp[n]);
}
return 0;
}