Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #ifdef ENABLE_DEBUG
- #define DEBUG(x) std::cout << x << std::endl
- #else
- #define DEBUG(x)
- #endif
- #define fi first
- #define se second
- #define pb push_back
- #define all(x) x.begin(),x.end()
- #define rall(x) x.rbegin(),x.rend()
- using namespace std;
- using ii = pair<int, int>;
- using i64 = long long;
- using ld = long double;
- const int INF = 0x3f3f3f3f;
- const i64 INFLL = 0x3f3f3f3f3f3f3f3f;
- const int N = 1e5;
- vector<vector<int>> dv;
- vector<vector<int>> fac;
- int main() {
- cin.tie(0)->sync_with_stdio(0);
- dv.assign(N+1, vector<int>());
- fac.assign(N+1, vector<int>());
- vector<int> cnt(N+1, 0);
- for (int i = 1; i <= N; ++i) {
- int l = i;
- for (int j = 2; (i64)j * j <= l; ++j) {
- while (l % j == 0) {
- l /= j;
- fac[i].pb(j);
- }
- }
- if (l > 1) fac[i].pb(l);
- for (int j = i; j <= N; j += i) {
- dv[j].pb(i);
- }
- }
- int n; cin >> n;
- vector<ld> a(n + 1, 0.0);
- vector<int> b(n + 1);
- int sum = 0;
- for (int i = 1; i <= n; ++i) {
- cin >> b[i];
- sum += b[i];
- }
- for (int i = 1; i <= n; ++i) {
- a[i] = (ld) 1.0 * b[i] / (ld) sum;
- }
- vector<ld> dp(n + 1, 0.0);
- for (int x = n; x >= 1; --x) {
- vector<ii> caras;
- for (int y = x; y <= n; y += x) {
- // x | y
- int f = 1;
- for (int d : fac[x]) {
- ++cnt[d];
- }
- int xx = x;
- int last = -1;
- int counter = 0;
- int prod = 1;
- for (int d : fac[y]) {
- if (d == last) {
- prod *= d;
- ++counter;
- } else {
- if (last != -1 and counter > cnt[last]) {
- f *= prod;
- for (int i = 0; i < cnt[last]; ++i)
- xx /= last;
- }
- prod = d;
- counter = 1;
- }
- last = d;
- }
- if (last != -1 and counter > cnt[last]) {
- f *= prod;
- for (int i = 0; i < cnt[last]; ++i)
- xx /= last;
- }
- for (int d : dv[xx]) if (d * f <= n) {
- int z = d * f;
- caras.pb({y, z});
- } else {
- break;
- }
- for (int d : fac[x]) {
- --cnt[d];
- }
- }
- ld s1 = 0;
- ld ss = 0;
- for (auto [z, j] : caras) {
- if (z == x) {
- ss += a[j];
- s1 += a[j];
- } else {
- ss += (ld) a[j] * (1.0 + dp[z]);
- }
- }
- dp[x] = ss / ld(1.0 - s1);
- }
- cout << fixed << setprecision(10) << dp[1] << '\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment