题意:给一个数,用这个数的约数(包括自己)去除这个数,直到得数为1,求除的次数的期望。
思路:设一个数的约数有num个,E[n] = E[a[1]]/num+E[a[2]]/num+...+E[a[num]]/num+1 (因为又除一次,所以+1)
整理得:E[n]=(E[a[1]]+E[a[2]]+...+E[a[num-1]]+num)/(num-1)
AC代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main(){
double dp[100010];
int T, Case = 1;
int N;
memset( dp, 0, sizeof( dp ) );
dp[1] = 0;
for( int i = 2; i <= 100000; i++ ){
double sum = 0;
int cnt = 0;
for( int j = 1; j * j <= i; j++ ){
if( i % j == 0 ){
sum += dp[j];
cnt++;
if( j != i / j ){
sum += dp[i/j];
cnt++;
}
}
}
dp[i] = ( sum + cnt ) / ( cnt - 1 );
}
cin >> T;
while( T-- ){
cin >> N;
printf( "Case %d: %lf\n", Case++, dp[N] );
}
return 0;
}