Editorial for COCI '17 Contest 2 #6 Garaža
Submitting an official solution before solving the problem yourself is a bannable offence.
Let's observe any array of natural numbers  and the GCD (greatest common divisor) of each prefix in the array, 
. For example:
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
| 216 | 144 | 96 | 96 | 120 | 560 | 9 | 8 | |
| 216 | 72 | 24 | 24 | 24 | 8 | 1 | 1 | 
Let's observe the two adjacent values  and 
. The following properties hold:
is divisible by
.
. In the case that
, then it holds
, which is why the value
will change
times at most.
We conclude that array  can be written in a different way, so that we group all the prefixes with the same GCD, as an array of at most 
 pairs of numbers 
 where 
 represents one of the values 
, and 
 represent the number of appearances of that value in array 
. For example, the array 
 from the above example can be written as: 
. Analogously, we can write the GCD of all suffixes of array 
.
We will solve this task using a segment tree where we will store the following data for each interval:
- GCD of all prefixes 
(in the above mentioned form, so as an array of pairs
),
 - GCD of all suffixes 
(also in the above mentioned form), and
 - The number of interesting contiguous subsequences in that interval, 
.
 
In order to apply the tournament tree data structure on this task, we need to define how we can determine new data for the union of intervals, based on the aforementioned data for two adjacent intervals. Let there be two adjacent intervals  and 
. Based on the GCD of all prefixes 
 and 
, let's try to determine the GCD of all prefixes 
 (where 
 represents the union of intervals 
 and 
). Array 
 is calculated in the following way:
for
, for
We can notice that in some cases it will be possible to additionally group some elements in the array  by values 
, and that the length of the total array is never going to be larger than 
. The complexity of determining this array is 
, and analogously, we can determine the array 
 that represents the GCD of all suffixes of interval 
.
All that is left to determine is how we can calculate the number of interesting subsequences in the interval  (
). These values will be equal to the sum of values 
, 
 and the number of interesting subsequences that are in both intervals 
 and 
. Let 
 correspond to the interval 
, and 
 to the interval 
. Let's observe the smallest 
 from the interval 
, for which a 
 exists from the interval 
 such that it holds that the subsequence 
 is interesting, and the subsequence 
 is not. The GCD of the subsequence 
 can be calculated as the largest common divisor of the GCD-suffix until position 
 in array 
 and the GCD-prefix until position 
 in array 
. However, we should notice one more thing: as we increase 
, so will the value 
 either remain the same or increase by a positive number. Therefore, the number of interesting subsequences contained in both intervals 
 and 
 can be calculated using the two-pointer technique, 
 that will iterate over array 
 and 
 that will iterate over array 
. The complexity of this approach is 
, i.e. 
.
The total complexity of the joining is , so the total complexity of the algorithm is 
.
Comments