Untitled

 avatar
unknown
plain_text
a year ago
2.2 kB
6
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