Untitled

 avatar
unknown
plain_text
a year ago
2.1 kB
10
Indexable
#include<iostream>

#include <bits/stdc++.h>

#define ll long long
#define ld long double
#define IO ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
const int N = 1e5 + 6, mod = 1e9 + 7;
int n, a[N];
int dp[N], mu[N];
int inv[N];
vector<int> adj[N];

void preprocess() {
    for (int i = 1; i < N; i++) {

        if (i < 2)inv[i] = 1;
        else inv[i] = mod - 1ll * mod / i * inv[mod % i] % mod;

        for (int j = i; j < N; j += i) {
            adj[j].push_back(i); 
        }
        if (i == 1) {
            mu[1] = 1;
        } else if (adj[i].size() == 1) {
            mu[i] = -1;
        } else if ((i / adj[i][1]) % adj[i][1] == 0) {
            mu[i] = 0;
        } else {
            mu[i] = -mu[i / adj[i][1]];
        }
    }
}

int sum[N];

void add(int i, int d) {
    int x = a[i];
    int v = 1ll * x * i % mod;
    for (auto div: adj[x]) {
        sum[div] = (sum[div] + v * d) % mod;
    }
}

int query(int i) {
    int x = a[i];
    int ans = 0;
    for (auto g: adj[x]) {
        int y = x / g;
        int total = 0;
        for (auto div: adj[y]) {
            total = (total + sum[g * div] * mu[div]) % mod;
        }
        ans = (ans + 1ll * total * inv[g]) % mod;
    }
    return 1ll * ans * x % mod * i % mod;
}

void doWork() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        dp[i] = 0;
    }
    ll ans = 0;

    for (int i = n; i >= 1; i--) {
        for (int j = i; j <= n; j += i) {
            add(j, 1);
            dp[i] = (dp[i] + query(j)) % mod;
        }
        for (int j = i; j <= n; j += i) {
            add(j, -1);
            if (j > i)dp[i] = (dp[i] - dp[j]) % mod;
        }
        ans = (ans + 1ll * dp[i] * inv[i]) % mod;
    }
    ans = ans * 2 % mod;
    for (int i = 1; i <= n; i++) {
        ans = (ans - 1ll * i * a[i]) % mod;
    }
    cout << (ans + mod) % mod << "\n";
    //
}

int main() {
    IO
    preprocess();
    int t = 1;
//    cin >> t;

    for (int i = 1; i <= t; i++) {
        //  cout << "Case #" << i << ": ";
        doWork();
    }
}
Editor is loading...
Leave a Comment