Untitled
unknown
plain_text
a year ago
2.2 kB
11
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;
vector<int> divos[N];
int inv[N];
int n;
int a[N];
int fast(int b, int e) {
int res = 1;
for(;e;b=1ll*b*b%mod,e>>=1)if(e&1)res = 1ll * res * b % mod;
return res;
}
int ans[N];
bitset<N> bt;
vector<int> toCheck;
int sum[N];
vector<int> go[N];
int calc(vector<int> & inds) {
toCheck.clear();
for(auto x : inds) {
for(auto v : divos[a[x]]) {
bt.set(v);
go[v].push_back(x);
}
}
// for(int i = 1; i <= n*2; i++) if(bt[i]){
// toCheck.push_back(i);
// }
for(int i = bt._Find_first(); i < N; i = bt._Find_next(i)) {
toCheck.push_back(i);
}
reverse(toCheck.begin(), toCheck.end());
int res = 0;
for(auto d : toCheck) {
int cur = 0;
for(auto p : go[d]) {
cur = (cur + 1ll * a[p] * p) % mod;
}
go[d].clear();
bt[d] = 0;
sum[d] = (sum[d]+1ll*cur*cur)%mod;
for(auto x : divos[d]) if(bt[x]){
sum[x] = (sum[x] + mod - sum[d]);
if(sum[x] >= mod) sum[x] -= mod;
}
res = (res + 1ll*sum[d] * inv[d] % mod) % mod;
sum[d] = 0;
}
return res;
}
void doWork() {
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> a[i];
}
vector<int> vals;
int res = 0;
for(int g = n; g >= 1; --g) {
vals.clear();
for(int i = g; i <= n; i += g) {
vals.push_back(i);
}
ans[g] = calc(vals) % mod;
for(int i = g + g; i <= n; i += g) {
if((ans[g]-=ans[i])<0)ans[g]+=mod;
}
res = (res + 1ll*ans[g] * inv[g]) % mod;
}
cout << res << '\n';
}
int main() {
IO
int t = 1;
for(int i = 1; i < N; i++) {
inv[i] = fast(i, mod - 2);
for(int j = i; j < N; j += i) {
divos[j].push_back((i));
}
}
// cout<<solve(2);
// cin >> t;
// return 0;
for (int i = 1; i <= t; i++) {
// cout << "Case #" << i << ": ";
doWork();
}
}
Editor is loading...
Leave a Comment