classSolution { // 二分法指数法则 privatelongquickMul(long x, long y, long m) { longres=1; while (y > 0) { // 只有到了1位才更新res if ((y & 1) == 1) { res = (res * x) % m; } y >>= 1; // 每次都进行平方 x = (x * x) % m; } return res; }
// 避免重复对堆进行计算(优化处理较大K) publicint[] getFinalState(int[] nums, int k, int multiplier) { if (multiplier == 1) { return nums; } intn= nums.length, mx = 0; longm=1000000007L; PriorityQueue<long[]> v = newPriorityQueue<>((x, y) -> { if (x[0] != y[0]) { return Long.compare(x[0], y[0]); } else { return Long.compare(x[1], y[1]); } }); for (inti=0; i < n; i++) { mx = Math.max(mx, nums[i]); v.offer(newlong[]{nums[i], i}); } for (; v.peek()[0] < mx && k > 0; k--) { long[] x = v.poll(); x[0] *= multiplier; v.offer(x); } for (inti=0; i < n; i++) { // 还是从堆中取元素出来 long[] x = v.poll(); // 计算第一次乘完之后那些重复计算的次数 intt= k / n + (i < k % n ? 1 : 0); nums[(int)x[1]] = (int)((x[0] % m) * quickMul(multiplier, t, m) % m); } return nums; } }