IgorPrado's blog

By IgorPrado, history, 6 weeks ago, In English

D. Shohad Loves GCD

English version:

Link to the problem: Codeforces Problem 2039D

Let $$$S = {x_1, \dotsc, x_m}$$$ be the set of $$$m$$$ elements ($$$m \leq n$$$), ordered in increasing order. Denote $$$a = [a_1, \dotsc, a_n]$$$ as the array we want to construct.

Notice that to maximize $$$a$$$ lexicographically, any solution $$$a'$$$ that fixes a prefix $$$a[0..i]$$$ and immediately improves element $$$i+1$$$ is better, regardless of what comes afterward. Thus, we greedily try to place the largest elements at the beginning. It follows that $$$a_1 = x_m$$$.

Suggestion

Solve the problem generically for $$$n = 1, 2, 3, \dotsc$$$ for a set $$$S = {x_1, \dotsc, x_m}$$$. You will observe that the solution follows a pattern:

$$$ [x_m, x_{m-1}, x_{m-1}, x_{m-2}, x_{m-1}, x_{m-2}, x_{m-1}, x_{m-3}, \dotsc] $$$

This pattern can indeed be formalized as follows:

Theorem 1

If $$$k = \prod_{i \in \mathbb{N}}p_i^{\alpha_i}$$$ is the prime factorization of $$$k$$$, then defining $$$w(k) = \sum_{i \in \mathbb{N}}\alpha_i$$$, we have:

$$$ a_k = x_{m-w(k)} $$$

Proof

We proceed by induction:

  • Base case: $$$k = 1$$$ is trivial since $$$a_1 = x_m$$$ always.
  • Inductive step: Assume as the inductive hypothesis that the optimal solution for $$$a[1..k-1]$$$ is constructed this way.

Validity of $$$a_k = x_{m-w(k)}$$$

For any $$$1 \leq j < k$$$ with $$$j = \prod_{i \in \mathbb{N}}p_i^{\beta_i}$$$, we have $$$\gcd(j, k) < k$$$, and hence the inductive hypothesis applies to $$$a_{\gcd(j, k)}$$$:

$$$ a_{\gcd(j, k)} = x_{m-\sum_{i \in \mathbb{N}} \min(\alpha_i, \beta_i)} $$$

Since $$$\gcd(j, k) < k$$$, it follows that:

$$$ \sum_{i \in \mathbb{N}} \min(\alpha_i, \beta_i) < \sum_{i \in \mathbb{N}} \alpha_i $$$

Thus, $$$a_{\gcd(j, k)} > a_k \geq \gcd(a_j, a_k)$$$, and in particular, they are distinct.

Maximality of $$$a_k = x_{m-w(k)}$$$

To show this choice is maximal, we need to show its index in $$$S$$$ is the largest possible, which suffices since $$$S$$$ is ordered.

  1. If $$$k$$$ is prime: $$$w(k) = 1$$$, so $$$a_k = x_{m-1}$$$. This is evidently the best solution. Considering the pair $$$(1, k)$$$, we have:
$$$ a_{\gcd(1, k)} = x_m \neq \gcd(a_1, a_k) = \gcd(x_m, a_k) $$$

Hence, $$$a_k \neq x_m$$$. For all $$$2 \leq j < k$$$, $$$\gcd(j, k) = 1$$$ because of the primality of $$$k$$$, so $$$a_1 = x_m > a_j \geq \gcd(a_j, a_k)$$$.

  1. If $$$k$$$ is not prime: Define $$$w(k) = \sum_{i \in \mathbb{N}}\alpha_i$$$, the total count of prime factors of $$$k$$$ (with multiplicity). For any $$$0 \leq j < w(k)$$$, consider a divisor $$$q \mid k$$$ with $$$j$$$ prime factors. Then:
$$$ a_{\gcd(q, k)} = a_q = x_{m-j} \neq \gcd(a_q, a_k) = \gcd(x_{m-j}, a_k) $$$

Therefore, $$$a_k \neq x_{m-j}$$$ for all $$$0 \leq j < w(k)$$$, proving maximality.

This proves the theorem by induction.

Complexity and Implementation

Thus, we have $$$a_k = x_{m-w(k)}$$$. Note that for any prime $$$p$$$ dividing $$$k$$$:

$$$ w(k) = w\left(\frac{k}{p}\right) + 1 $$$

We can iterate, for each $$$k = 2..n$$$, over the $$$O(\sqrt{k})$$$ smallest numbers to find the smallest prime factor, achieving $$$O(n\sqrt{n})$$$ complexity, which suffices to pass. Alternatively, using a sieve with SPF (smallest prime factor), we can solve this in $$$O(n \log \log n)$$$, which easily fits within the time limit.

Impossibility Condition

The solution is impossible if and only if:

$$$ \max_{1 \leq k \leq n} w(k) > m $$$

as there will not be enough numbers to allocate.

PT-BR

Link para problema: https://mirror.codeforces.com/problemset/problem/2039/D

Seja $$$S = {x_1, \dotsc, x_m}$$$ o conjunto ordenado em ordem crescente de $$$m$$$ elementos ($$$m \leq n$$$). Denote por $$$a = [a_1, \dotsc, a_n]$$$ o array que queremos montar.

Note que, como queremos maximizar $$$a$$$ na ordem lexicográfica, qualquer solução $$$a'$$$ que fixa um prefixo $$$a[0..i]$$$ e melhora o elemento $$$i+1$$$ imediatamente é melhor, independente do que vem depois. Logo, gulosamente tentaremos colocar os maiores elementos no início. Segue portanto que $$$a_1 = x_m$$$.

Sugestão: realize a solução genérica do problema para $$$n=1,2,3,\dotsc$$$, para um conjunto $$$S = {x_1, \dotsc, x_m}$$$. Você irá observar que a solução segue um padrão: $$$[x_m, x_{m-1}, x_{m-1}, x_{m-2}, x_{m-1}, x_{m-2}, x_{m-1}, x_{m-3}, \dotsc]$$$. Esse padrão de fato pode ser formalizado da seguinte forma:

Teorema 1: se $$$k = \prod_{i \in \mathbb{N}}p_i^{\alpha_i}$$$ é a decomposição de $$$k$$$ em primos, definindo $$$w(k) = \sum_{i \in \mathbb{N}}\alpha_i$$$ então

$$$a_k = x_{m-w(k)}$$$

Procedemos por indução, com o caso base $$$k = 1$$$ trivial, já que $$$a_1 = x_m$$$ sempre. Suponha então como hipótese indutiva que a solução ideal para $$$a[1..k-1]$$$ é construído dessa forma.

Primeiro mostramos que colocar $$$a_k = x_{m-w(k)}$$$ é válido. De fato, para todo $$$1 \leq j < k$$$ com $$$j = \prod_{i \in \mathbb{N}}p_i^{\beta_i}$$$, temos que $$$gcd(j, k) < k$$$ e portanto vale a hipótese indutiva sobre $$$a_{gcd(j, k)}$$$:

$$$a_{gcd(j, k)} = x_{m-\sum_{i \in \mathbb{N}}\min(\alpha_i, \beta_i)}$$$

Como $$$gcd(j, k) < k$$$ então $$$\sum_{i \in \mathbb{N}}\min(\alpha_i, \beta_i) < \sum_{i \in \mathbb{N}} \alpha_i$$$ e logo, por possuir um índice maior no conjunto $$$S$$$, $$$a_{gcd(j, k)} > a_k \geq gcd(a_j, a_k)$$$, e portanto em especial são diferentes.

Para mostrar que essa escolha de $$$a_k$$$ é máxima, vamos mostrar que seu índice em $$$S$$$ é máximo, o que é suficiente por $$$S$$$ estar ordenado.

  1. Se $$$k$$$ é primo, então $$$w(k) = 1$$$ e $$$a_k = x_{m-w(k)} = m-1$$$, e isso é evidentemente a melhor solução: analisando o par $$$(1, k)$$$ temos que $$$a_{gcd(1,k)} = x_m \neq gcd(a_1, a_k) = gcd(x_m, a_k)$$$ de onde segue que $$$a_k \neq x_m$$$, e para todo $$$2 \leq j < k$$$ temos que $$$gcd(j, k) = 1$$$ e logo já segue que $$$a_1 = x_m > a_j \geq gcd(a_j, a_k)$$$.
  2. Se $$$k$$$ não é primo, defina por $$$w(k) = \sum_{i \in \mathbb{N}}\alpha_i$$$ a quantidade de fatores primos em $$$k$$$ com multiplicidade. Para todo $$$0 \leq j < w(k)$$$, considerando um divisor $$$q | k$$$ com $$$j$$$ fatores primos (considerando multiplicidade), então precisamos que $$$a_{gcd(q, k)} = a_{q} = x_{m-j}$$$ seja diferente de $$$gcd(a_q, a_k) = gcd(x_{m-j}, a_k)$$$ e portanto $$$a_k \neq x_{m-j}$$$ para todo $$$0 \leq j < w(k)$$$, provando a maximalidade de escolher $$$a_k = x_{m-w(k)}$$$.

Isso prova o teorema por indução.

Portanto, temos que $$$a_k = x_{m-w(k)}$$$. Porém note que para todo primo $$$p$$$ que divida $$$k$$$

$$$w(k) = w(\frac{k}{p}) + 1$$$

e podemos simplesmente iterar, para cada $$$k=2..n$$$, pelos $$$O(\sqrt{k})$$$ primeiros números para encontrar o menor fator primo, e resolver em $$$O(n\sqrt{n})$$$, o que já é suficiente para passar, ou utilizar crivo + SPF e resolver em $$$O(n \log \log n)$$$ para passar no tempo limite com folga.

Além disso, já temos nossa condição de impossibilidade: a solução é impossível se e somente se

$$$\max_{1 \leq k \leq n}w(k) > m$$$

pois não vão haver números o suficiente para desconsiderar.

  • Vote: I like it
  • -12
  • Vote: I do not like it

»
6 weeks ago, # |
  Vote: I like it 0 Vote: I do not like it

Auto comment: topic has been updated by IgorPrado (previous revision, new revision, compare).

»
6 weeks ago, # |
  Vote: I like it 0 Vote: I do not like it

Auto comment: topic has been updated by IgorPrado (previous revision, new revision, compare).

»
6 weeks ago, # |
  Vote: I like it 0 Vote: I do not like it

Auto comment: topic has been updated by IgorPrado (previous revision, new revision, compare).

»
6 weeks ago, # |
  Vote: I like it 0 Vote: I do not like it

Auto comment: topic has been updated by IgorPrado (previous revision, new revision, compare).