题目链接:Race to 1 Again - LightOJ 1038 - Virtual Judge (ppsucxtt.cn)
题意:给你个数n,然后随机选择n的一个因子,然后n除以其因子,求n变成1的次数的期望。
题目的分析我写在了一张纸上:
知道了这个之后我们就可以用n的因子来求出n的期望,注意一些细节,比如我们要求的不是因子的个数,而是因子的个数减一,下面是代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
const int N=1e5+10;
double ans[N];
int main()
{
int T;
cin>>T;
for(int i=2;i<=N;i++)
{
int p=-1;
double sum=0;
int len=sqrt(i);
for(int j=1;j<=len;j++)
{
if(i%j==0)
{
p++;
sum+=ans[j]+1;
if(i/j!=j)
{
p++;
sum+=ans[i/j]+1;//当i/j等于i时,ans[i/j]=0,相当于没有计算E[i]
}
}
}
ans[i]=sum/p;
printf("%d %d\n",i,p);
}
for(int o=1;o<=T;o++)
{
int n;
scanf("%d",&n);
printf("Case %d: %.10lf\n",o,ans[n]);
}
return 0;
}