Untitled
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