The key idea is to distribute the multiplication operations as evenly as possible among all indices. We first ensure that every element receives at least one operation, so that no element remains the smallest after the first round. After this, we distribute the remaining operations as evenly as possible, using the fact that multiplying by the multiplier repeatedly grows the value exponentially. To efficiently compute large powers, we use exponentiation by squaring.
classSolution {
staticfinallong MOD = 1_000_000_007;
longpowerMod(long base, long exp, long mod) {
long res = 1;
while (exp > 0) {
if ((exp & 1) == 1) res = (res * base) % mod;
base = (base * base) % mod;
exp >>= 1;
}
return res;
}
publicint[]getFinalState(int[] nums, int k, int multiplier) {
if (multiplier == 1) return nums;
int n = nums.length;
PriorityQueue<long[]> pq =new PriorityQueue<>(Comparator.comparingLong(a -> a[0]));
for (int i = 0; i < n; i++) pq.offer(newlong[]{nums[i], i});
Set<Long> done =new HashSet<>();
while (done.size() < n && k > 0) {
long[] p = pq.poll();
p[0]*= multiplier;
pq.offer(p);
done.add(p[1]);
k--;
}
long[] v =newlong[n];
while (!pq.isEmpty()) {
long[] p = pq.poll();
v[(int)p[1]]= p[0];
}
int rep = k / n, md = k % n;
int[] ops =newint[n];
for (int i = 0; i < n; i++) {
ops[i]= rep;
if (i < md) ops[i]++;
}
for (int i = 0; i < n; i++) {
long mlt = powerMod(multiplier, ops[i], MOD);
v[i]= (v[i]% MOD) * (mlt % MOD) % MOD;
nums[i]= (int)v[i];
}
return nums;
}
}
classSolution {
privateval MOD = 1_000_000_007L
privatefunpowerMod(base: Long, exp: Long, mod: Long): Long {
var res = 1Lvar b = base
var e = exp
while (e > 0) {
if (e % 2==1L) res = (res * b) % mod
b = (b * b) % mod
e /=2 }
return res
}
fungetFinalState(nums: IntArray, k: Int, multiplier: Int): IntArray {
if (multiplier ==1) return nums
val n = nums.size
val pq = java.util.PriorityQueue<Pair<Long, Int>>(compareBy { it.first })
for (i in0 until n) pq.add(nums[i].toLong() to i)
val done = mutableSetOf<Int>()
var kk = k
while (done.size < n && kk > 0) {
val(v, idx) = pq.poll()
pq.add((v * multiplier) to idx)
done.add(idx)
kk-- }
val v = LongArray(n)
while (pq.isNotEmpty()) {
val(valx, idx) = pq.poll()
v[idx] = valx
}
val rep = kk / n
var md = kk % n
val ops = IntArray(n) { rep }
for (i in0 until n) if (i < md) ops[i]++for (i in0 until n) {
val mlt = powerMod(multiplier.toLong(), ops[i].toLong(), MOD)
v[i] = (v[i] % MOD) * (mlt % MOD) % MOD
nums[i] = v[i].toInt()
}
return nums
}
}
import heapq
classSolution:
defpowerMod(self, base: int, exp: int, mod: int) -> int:
res =1while exp >0:
if exp %2==1:
res = (res * base) % mod
base = (base * base) % mod
exp //=2return res
defgetFinalState(self, nums: list[int], k: int, multiplier: int) -> list[int]:
if multiplier ==1:
return nums
n = len(nums)
h = [(v, i) for i, v in enumerate(nums)]
heapq.heapify(h)
done = set()
while len(done) < n and k >0:
v, idx = heapq.heappop(h)
v *= multiplier
heapq.heappush(h, (v, idx))
done.add(idx)
k -=1 v = [0] * n
while h:
val, idx = heapq.heappop(h)
v[idx] = val
rep, md = divmod(k, n)
ops = [rep] * n
for i in range(md):
ops[i] +=1 modv =10**9+7for i in range(n):
mlt = self.power_mod(multiplier, ops[i], modv)
v[i] = (v[i] % modv) * (mlt % modv) % modv
nums[i] = v[i]
return nums
impl Solution {
pubfnget_final_state(nums: Vec<i32>, mut k: i32, multiplier: i32) -> Vec<i32> {
use std::collections::{BinaryHeap, HashSet};
use std::cmp::Reverse;
let n = nums.len();
if multiplier ==1 { return nums; }
letmut h = nums.into_iter().enumerate().map(|(i, v)| (v asi64, i)).collect::<Vec<_>>();
h.sort();
letmut done = HashSet::new();
while done.len() < n && k >0 {
let (v, idx) = h.remove(0);
h.push((v * multiplier asi64, idx));
h.sort();
done.insert(idx);
k -=1;
}
letmut v =vec![0i64; n];
for (val, idx) in h { v[idx] = val; }
let rep = k / n asi32;
let md = k % n asi32;
letmut ops =vec![rep; n];
for i in0..md asusize { ops[i] +=1; }
let modv =1_000_000_007i64;
fnpower_mod(mut base: i64, mut exp: i32, modv: i64) -> i64 {
letmut res =1i64;
while exp >0 {
if exp %2==1 { res = res * base % modv; }
base = base * base % modv;
exp /=2;
}
res
}
letmut res =vec![0i32; n];
for i in0..n {
let mlt = power_mod(multiplier asi64, ops[i], modv);
v[i] = (v[i] % modv) * (mlt % modv) % modv;
res[i] = v[i] asi32;
}
res
}
}