Skip to content

Commit 89351e1

Browse files
authored
Create 2818. Apply Operations to Maximize Score (#755)
2 parents 6b74e8c + 495fd73 commit 89351e1

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed
+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
typedef long long ll;
2+
class Solution {
3+
public:
4+
// left: greater or equal
5+
// right: greater
6+
ll mod = 1e9 + 7;
7+
ll myPow(ll a, ll b) {
8+
ll res = 1;
9+
while (a) {
10+
if (a & 1) res = (res * b) % mod;
11+
a = a >> 1;
12+
b = b * b % mod;
13+
}
14+
return res;
15+
}
16+
int maximumScore(vector<int>& nums, int k) {
17+
int n = nums.size();
18+
vector<int> prime(n, 0);
19+
for (int i = 0; i < nums.size(); i++) {
20+
int cnt = 0;
21+
int num = nums[i];
22+
for (int j = 2; j * j <= num; j++) {
23+
cnt += (num % j) == 0;
24+
while ((num % j) == 0) num /= j;
25+
}
26+
if (num != 1) cnt += 1;
27+
prime[i] = cnt;
28+
}
29+
unordered_map<int, int> leftMap;
30+
unordered_map<int, vector<int>> rightMap;
31+
for (int i = n - 1; i >= 0; i--) {
32+
rightMap[prime[i]].push_back(i);
33+
}
34+
35+
vector<pair<ll, ll>> record;
36+
for (ll i = 0; i < n; i++) {
37+
rightMap[prime[i]].pop_back();
38+
ll leftLen = i + 1;
39+
for (int j = prime[i]; j <= 10; j++)
40+
if (leftMap.count(j))
41+
leftLen = min(leftLen, i - leftMap[j]);
42+
ll rightLen = n - i;
43+
for (int j = prime[i] + 1; j <= 10; j++)
44+
if (rightMap.count(j) && rightMap[j].size() > 0)
45+
rightLen = min(rightLen, rightMap[j].back() - i);
46+
record.push_back({nums[i], leftLen * rightLen});
47+
leftMap[prime[i]] = i;
48+
}
49+
sort(record.begin(), record.end(), greater<>());
50+
51+
ll ans = 1;
52+
for (auto &x: record) {
53+
ll tmp = myPow(min(x.second, 1ll * k), x.first);
54+
ans = (ans * tmp) % mod;
55+
k -= x.second;
56+
if (k <= 0) break;
57+
}
58+
return ans;
59+
}
60+
};

0 commit comments

Comments
 (0)