lightOJ挂了好多天。。。搞得题解现在才写,不过那4道题一起过了还是挺开心的233.
http://lightoj.com/volume_showproblem.php?problem=1030
一个数字每次可以除以他的所有约数,问期望几次到1。
看见有T=20000,n=1e5,那么肯定就是预处理出来离线了。
f[i]表示到1的期望次数,那么f[i]就等于他的所有约数j的f[j]+1 之和。
设f[i]=t 则 t=(sigma(f[j]+1)+t+1)/cnt 其中j<i 且j | i ,cnt为j的个数+1,也就是约数总个数,就可以吧f[i]解出来了。
好像自从qt教了我这个解方程的方法后我做期望题都会想到解方程上,,,
#include<bits/stdc++.h>
#define maxl 100010
#define mod 1000000007
using namespace std;
int n,k,cas;
double f[maxl];
inline void init()
{
f[1]=0;int len,cnt;
double sum;
for(int i=2;i<maxl;i++)
{
len=sqrt(i);cnt=0;sum=0;
for(int j=1;j<=len;j++)
if(i%j==0)
{
cnt++;sum+=f[j];
if(j*j<i)
{
if(i/j!=i)
sum+=f[i/j];
cnt++;
}
}
f[i]=(sum+cnt)/(cnt-1);
}
}
int main()
{
init();
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
scanf("%d",&n);
printf("Case %d: %.6f\n",i,f[n]);
}
return 0;
}