func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MOD = 1e9 + 7;   const int maxn = 100000 + 5;   const long double eps = 1e-6;   long double PI = acos((long double)(-1));   long long n, m, par[maxn][20], cnt[maxn], st[maxn], fi[maxn], ti;   long long h[maxn];   long double qd[maxn], qu[maxn];   vector<int> e[maxn];   void dfs(int u, int p = -1) {     st[u] = ti++;     h[u] = ~p ? h[p] + 1 : 0;     par[u][0] = p;     bool leaf = 1;     for (int i = 1; i < 20; i++) {       if (~par[u][i - 1]) par[u][i] = par[par[u][i - 1]][i - 1];     }     int sz = e[u].size();     for (int i = 0; i < sz; i++) {       int v = e[u][i];       if (v != p) {         leaf = 0;         dfs(v, u);         cnt[u] += cnt[v] + 1;       }     }     for (int i = 0; i < sz; i++) {       int v = e[u][i];       if (v != p) qd[u] += 1.0 * cnt[v] / cnt[u] * qd[v];     }     if (~leaf) qd[u] += 1;     fi[u] = ti++;   }   void dfs_d(int u, int p = -1) {     if (~p) {       long double cntd = cnt[p] - cnt[u] - 1, nou, kcntd, kasr;       if (cntd == 0) {         kcntd = 1.0 / (n - cnt[u] - 1);         qu[u] = qu[p] * kcntd * (n - cnt[p] - 1) + (n - cnt[p]) * kcntd;       } else {         kcntd = 1.0 / cntd;         nou = qd[p] * kcntd * cnt[p] - qd[u] * kcntd * cnt[u] - cnt[u] * kcntd -               kcntd;         kasr = 1.0 / (n - cnt[u] - 1);         qu[u] = cntd * kasr * nou + qu[p] * kasr * (n - cnt[p] - 1) + 1;       }     }     int sz = e[u].size();     for (int i = 0; i < sz; i++) {       int v = e[u][i];       if (v != p) dfs_d(v, u);     }   }   int ispar(int u, int v) { return st[u] <= st[v] && fi[v] <= fi[u]; }   int up(int u, int d) {     for (int i = 20 - 1; i >= 0; i--)       if ((d >> i) & 1) u = par[u][i];     return u;   }   int lca(int u, int v) {     if (h[u] < h[v]) swap(u, v);     u = up(u, h[u] - h[v]);     if (u == v) return v;     for (int i = 20 - 1; i >= 0; i--) {       if (par[u][i] != par[v][i]) u = par[u][i], v = par[v][i];     }     return par[u][0];   }   long double query(int u, int v) {     if (h[u] > h[v]) swap(u, v);     if (ispar(u, v)) {       int w = up(v, h[v] - h[u] - 1);       long double cn = 1.0 / (cnt[v] + 1) / (n - cnt[w] - 1);       long double ans = cnt[v] * (n - cnt[w] - 1) * cn * qd[v] +                         (n - cnt[w] - 1) * (cnt[v] + 1) * cn * qu[w];       return ans + h[v] - h[u];     }     int w = lca(u, v);     long double cn = 1.0 / (cnt[u] + 1) / (cnt[v] + 1);     long double ans =         cnt[u] * (cnt[v] + 1) * cn * qd[u] + cnt[v] * (cnt[u] + 1) * cn * qd[v];     return h[u] - h[w] + h[v] - h[w] + ans + 1;   }   int main() {     std::ios_base::sync_with_stdio(false);     cin >> n >> m;     int u, v;     for (int i = 0; i < n - 1; i++) {       cin >> u >> v;       u--;       v--;       e[u].push_back(v);       e[v].push_back(u);     }     dfs(0);     dfs_d(0);     cout << fixed << setprecision(8);     while (m--) {       cin >> u >> v;       cout << query(--u, --v) << endl;     }     return 0;   }   