t个数据
然后一个n
输出变成1的期望
看个数据
dp[n]代表n变成1的期望
cnt代表因子个数 pi代表因子
那么dp[n]=1/cnt*(dp[n/p1]+1)+1/cnt*(dp[n/p2]+1)...
为什么加1呢 就是走到这个数要加一步
整理可得dp[n]=1/(cnt-1)(dp[n/p1]+dp[n/p2]...+cnt);
#include <stdio.h>
#include<algorithm>
#include<math.h> using namespace std; #define MAXN 100010 double dp[MAXN]; int main()
{
int t,ca;
scanf("%d",&t);
ca=;
dp[]=; for(int i=;i<=;i++)
{
double en=sqrt(1.0*i);
int cnt=;
dp[i]=; for(__int64 j=;j<=en;j++)
{
if(i%j==)
{
if(i/j==j) //去一下同样的
{
cnt++;
dp[i]+=dp[j];
}
else
{
cnt+=;
dp[i]+=dp[i/j];
dp[i]+=dp[j];
}
}
}
dp[i]=(dp[i]+cnt)/(cnt-);
} while (t--)
{
int n;
scanf("%d",&n);
printf("Case %d: %.6lf\n",ca++,dp[n]);
} return ;
}