每次一个数,问不断除以约数,到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;}