Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 5d78a22

Browse files
Create 3671.Sum-of-Beautiful-Subsequences.cpp
1 parent 8668ca7 commit 5d78a22

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
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

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /