#include <iostream> #include <cstdlib> #include <map> #include <vector> #include <set> #include <unordered_map> #include <cstring> using namespace std; typedef vector<int> vi; typedef pair<int,int> ii; typedef vector<ii> vii; vii adj(100010); vi seen(100010); vi path; void find_cycle(int i) { seen[i] = 1; int to = adj[i].first; path.push_back(i); if (seen[to]) { path.push_back(to); return; } else { find_cycle(to); } } int main() { int n; cin >> n; for (int i = 1; i <= n; i++) { int to, p; cin >> to >> p; if (to == i) { // this never happens while (1) {} } adj[i].first = to; adj[i].second = p; } double ans = 0; for (int i = 1; i <= n; i++) { if (!seen[i]) { path.clear(); find_cycle(i); double tmp = 1; /* for (int j = 0; j < path.size(); j++) { cout << path[j] << ", "; } cout << endl; */ // Make sure path.back() is in that path twice int count = 1; for (int j = 0; j < path.size()-1; j++) { if (path[j] == path.back()) count++; } if (count == 1) continue; for (int j = path.size() - 1; j >= 1; j--) { int to = path[j]; int from = path[j-1]; double p = (double)adj[to].second / 100.0; if (j != path.size()-1 && to == path.back()) break; // cout << from << " --> " << to << ": " << p << endl; tmp *= p; } ans += tmp; } } printf("%.2lf\n", ans); return 0; }