题目链接:A - Race to 1 Again
主要思路:
一个数可以转移到的数都是它除以它的因子。
故(cnt为x的因子个数,包括1,a为x的因子)
因为a有可能是1,故
两边同乘cnt,移项,再两边同时除以cnt-1,可得
终止态E(1)=0.0;
AC代码:
#include<cstdio>
#include<cstring>
#define M 100005
using namespace std;
double dp[M];
int n;
void dfs(int now) {
if(now==1)return;//终止态
double res=0.0;
int cnt=2;//还要算上1和x
for(int i=2; i*i<=now; i++) {//分解因子,注意不要算上x他自己和1这个因子
if(now%i)continue;
dfs(i);
dfs(now/i);
if(i*i==now) {
res+=dp[i];
cnt++;
} else {
res+=dp[i]+dp[now/i];
cnt+=2;
}
}
if(cnt)dp[now]=(res+cnt)/(1.0*cnt-1.0);
}
int main() {
int T;
scanf("%d",&T);
for(int Case=1; Case<=T; Case++) {
scanf("%d",&n);
printf("Case %d: ",Case);
memset(dp,0,sizeof(dp));//数组要清空
dfs(n);
printf("%.10lf\n",dp[n]);
}
}