Day11 - D - Race to 1 Again LightOJ - 1038

设dp_i为所求答案,每次选择因数的概率相同,设i有x个因数,dp_i=sum(1/x*x_j)+1,(x_j表示第j个因数),那我们就预处理每个数的因数即可,T=10000,需要预处理出答案

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) ((x)&(-x))
typedef long long LL;
typedef pair<int,int> pii;

const int maxn = 1e5+5;
vector<int> factor[maxn];
double dp[maxn];

void get_factor() {
    for(int i = 1; i < maxn; ++i) {
        for(int j = i; j < maxn; j += i)
            factor[j].push_back(i);
    }
}

void prework() {
    for(int i = 2; i < maxn; ++i) {
        int siz = factor[i].size();
        for(int j = 0; j < siz-1; ++j) {
            dp[i] += 1.0/siz * dp[factor[i][j]];
        }
        dp[i]++;
        dp[i] *= (double)siz/(siz-1);
    }
}

void run_case() {
    int n; cin >> n;
    cout << dp[n] << "\n";
}
 
int main() {
    //ios::sync_with_stdio(false), cin.tie(0);
    cout.flags(ios::fixed);cout.precision(10);
    int t; cin >> t;
    //while(t--)
    get_factor();
    prework();
    for(int i = 1; i <= t; ++i) {
        cout << "Case " << i << ": ";
        run_case();
    }
    //cout.flush();
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/GRedComeT/p/12342030.html