Untitled
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