LightOJ 1038 Race to 1 Again

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

posted on 2016-04-27 20:37  very_czy  阅读(161)  评论(0编辑  收藏  举报

导航