每次一个数,问不断除以约数,到1的时候,除的个数的期望。
怕超时,打表,递推公式:
(n的约数的个数(不含本身))*a[n]=a[n的约数(除了本身)](求和)+约数的个数(包含本身);
用a[8]举个例子;
a[8]=1/4*(a[1]+1)+1/4*(a[2]+1)+1/4*(a[4]+1)+1/4*(a[8]+1);
每次约去就让次数加一~
完美~
#include <iostream>
#include <functional>
#include <algorithm>
#include <complex>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <iomanip>
#include <sstream>
#include <utility>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <limits>
#include <memory>
#include <string>
#include <vector>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
using namespace std;
int main()
{
double a[100005];
a[1]=0;
for (int i=2;i<=100000;i++)
{
double temp=0;
double cnt=0;
for (int j=1;j*j<=i;j++)
{
if (i%j==0)
{
temp+=a[j];
cnt++;
if (i/j!=j&&j!=1)
{
temp+=a[i/j];
cnt++;
}
}
}
a[i]=(temp+cnt+1.0)/cnt;
}
// for (int i=2;i<=100000;i++)
// {
// if (i%10==0) system("pause");
// printf ("%d=%f\n",i,a[i]);
// }
int T,ncas=1;
scanf ("%d",&T);
while (T--)
{
int n;
scanf ("%d",&n);
printf ("Case %d: %.10f\n",ncas++,a[n]);
}
return 0;
}