|
| 1 | +class BIT{ |
| 2 | + public: |
| 3 | + int N; |
| 4 | + vector<long long>bitArr; // Note: all arrays are 1-index |
| 5 | + vector<long long>nums; |
| 6 | + long long M = 1e9+7; |
| 7 | + |
| 8 | + void init(int N) |
| 9 | + { |
| 10 | + this->N = N; |
| 11 | + bitArr.resize(N+1); |
| 12 | + nums.resize(N+1); |
| 13 | + } |
| 14 | + |
| 15 | + // increase nums[i] by delta |
| 16 | + void updateDelta(int i, long long delta) { |
| 17 | + int idx = i; |
| 18 | + while (idx <= N) |
| 19 | + { |
| 20 | + bitArr[idx]+=delta; |
| 21 | + bitArr[idx] %= M; |
| 22 | + idx+=idx&(-idx); |
| 23 | + } |
| 24 | + } |
| 25 | + |
| 26 | + // sum of a range nums[1:j] inclusively |
| 27 | + long long queryPreSum(int idx){ |
| 28 | + long long result = 0; |
| 29 | + while (idx){ |
| 30 | + result += bitArr[idx]; |
| 31 | + // result %= M; |
| 32 | + idx-=idx&(-idx); |
| 33 | + } |
| 34 | + return result; |
| 35 | + } |
| 36 | + |
| 37 | + // sum of a range nums[i:j] inclusively |
| 38 | + long long sumRange(int i, int j) { |
| 39 | + return queryPreSum(j)-queryPreSum(i-1); |
| 40 | + } |
| 41 | +}; |
| 42 | + |
| 43 | +long long MOD = 1e9+7; |
| 44 | + |
| 45 | +class Solution { |
| 46 | +public: |
| 47 | + int totalBeauty(vector<int>& nums) { |
| 48 | + int mx = *max_element(begin(nums), end(nums)); |
| 49 | + vector<vector<int>>pos(mx+1); |
| 50 | + for (int i=0; i<nums.size(); i++) { |
| 51 | + for (int j=1; j*j<=nums[i]; j++) { |
| 52 | + if (nums[i]%j==0) { |
| 53 | + pos[j].push_back(i); |
| 54 | + if (j*j!=nums[i]) pos[nums[i]/j].push_back(i); |
| 55 | + } |
| 56 | + } |
| 57 | + } |
| 58 | + |
| 59 | + vector<long long>seq(mx+1); |
| 60 | + for (int g=1; g<=mx; g++) { |
| 61 | + map<int,int>mp; |
| 62 | + for (int x: pos[g]) mp[nums[x]] = 1; |
| 63 | + int idx = 0; |
| 64 | + for (auto& [k,v]:mp) v = ++idx; |
| 65 | + |
| 66 | + vector<int>arr; |
| 67 | + for (int x: pos[g]) arr.push_back(mp[nums[x]]); |
| 68 | + |
| 69 | + BIT bit; |
| 70 | + bit.init(arr.size()); |
| 71 | + for (int x: arr) { |
| 72 | + long long ans = bit.queryPreSum(x-1) + 1; |
| 73 | + seq[g] = (seq[g]+ans)%MOD; |
| 74 | + bit.updateDelta(x, ans); |
| 75 | + } |
| 76 | + } |
| 77 | + |
| 78 | + long long ret = 0; |
| 79 | + for (int g=mx; g>=1; g--) { |
| 80 | + for (int j=g*2; j<=mx; j+=g) |
| 81 | + seq[g] = (seq[g]-seq[j]+MOD) % MOD; |
| 82 | + ret = (ret + g*seq[g]) % MOD; |
| 83 | + } |
| 84 | + return ret; |
| 85 | + } |
| 86 | +}; |
0 commit comments