You are given an integer array nums of length n and an integer p.
A non-empty subsequence of nums is called good if:
Its length is strictly less than n.
The greatest common divisor (GCD) of its elements is exactlyp.
You are also given a 2D integer array queries of length q, where each queries[i] = [indi, vali] indicates that you should update nums[indi] to vali.
After each query, determine whether there exists any good subsequence in the current array.
Return the number of queries for which a good subsequence exists.
The term gcd(a, b) denotes the greatest common divisor of a and b.
Β
Example 1:
Input:nums = [4,8,12,16], p = 2, queries = [[0,3],[2,6]]
Output:1
Explanation:
i
[indi, vali]
Operation
Updated nums
Any good Subsequence
0
[0, 3]
Update nums[0] to 3
[3, 8, 12, 16]
No, as no subsequence has GCD exactly p = 2
1
[2, 6]
Update nums[2] to 6
[3, 8, 6, 16]
Yes, subsequence [8, 6] has GCD exactly p = 2
Thus, the answer is 1.
Example 2:
Input:nums = [4,5,7,8], p = 3, queries = [[0,6],[1,9],[2,3]]
Output:2
Explanation:
i
[indi, vali]
Operation
Updated nums
Any good Subsequence
0
[0, 6]
Update nums[0] to 6
[6, 5, 7, 8]
No, as no subsequence has GCD exactly p = 3
1
[1, 9]
Update nums[1] to 9
[6, 9, 7, 8]
Yes, subsequence [6, 9] has GCD exactly p = 3
2
[2, 3]
Update nums[2] to 3
[6, 9, 3, 8]
Yes, subsequence [6, 9, 3] has GCD exactly p = 3
Thus, the answer is 2.
Example 3:
Input:nums = [5,7,9], p = 2, queries = [[1,4],[2,8]]
Output:0
Explanation:
i
[indi, vali]
Operation
Updated nums
Any good Subsequence
0
[1, 4]
Update nums[1] to 4
[5, 4, 9]
No, as no subsequence has GCD exactly p = 2
1
[2, 8]
Update nums[2] to 8
[5, 4, 8]
No, as no subsequence has GCD exactly p = 2
Thus, the answer is 0.
Β
Constraints:
2 <= n == nums.length <= 5 * 104
1 <= nums[i] <= 5 * 104
1 <= queries.length <= 5 * 104
queries[i] = [indi, vali]
1 <= vali, p <= 5 * 104
0 <= indi <= n - 1
Solutions
Solution 1: Segment Tree + GCD
We only care about numbers that are multiples of \(p\), because if a number is not divisible by \(p\), it can never belong to a subsequence whose GCD is exactly \(p\).
Therefore, we can treat positions whose values are not divisible by \(p\) as \(0\), and only maintain the following value for each position in the segment tree:
If \(\textit{nums}[i]\) is divisible by \(p\), store its actual value in the segment tree.
Otherwise, store \(0\).
In this way, the whole segment tree maintains the GCD of all current multiples of \(p\). Denote it by \(g\):
If \(g \ne p\), then no matter how we choose, the GCD of all candidate elements cannot be exactly \(p\), so the answer is definitely false.
If \(g = p\), then all multiples of \(p\) together already have GCD equal to \(p\).
Next, we still need the subsequence length to be strictly smaller than \(n\).
If not all elements are divisible by \(p\), that is, the number of valid elements satisfies \(\textit{cnt} < n\), then we can directly take all multiples of \(p\), and this is already a good subsequence of length less than \(n\).
If \(\textit{cnt} = n\), then every element is divisible by \(p\), so we must delete at least one element and check whether the GCD of the remaining elements is still \(p\).
Here we use the following fact: if \(n > 6\), all elements are divisible by \(p\), and the overall GCD is already \(p\), then we can always delete one element and still keep the GCD equal to \(p\). So we only need to brute-force the deleted position when \(n \le 6\) and all elements are divisible by \(p\). In that case, we query the GCD of the left part and the right part with the segment tree, and then merge them.
The segment tree supports two operations:
Point update: change one position to the new value or to \(0\).
Range query: get the GCD of a given interval.
After each query update, we just apply the rules above to determine whether a good subsequence exists.
The time complexity is \(O((n + q) \times \log n)\). In the worst case, when \(n \le 6\), we additionally enumerate the deleted position for each query, but that is only a constant factor. So the total complexity remains \(O((n + q) \times \log n)\). The space complexity is \(O(n)\), where \(n\) is the length of \(\textit{nums}\) and \(q\) is the number of queries.