Marytone Contest | divixori

This was the problem page during the contest. Access the current page here.
Time limit: 1s Memory limit: 512MB Input: divixori.in Output: divixori.out

În timpul concursului limita de timp a fost majorată la 1.5s. Acum am schimbat-o înapoi la 1s pentru a încuraja găsirea unor soluții mai eficiente.

Enunț

Omul fantastic găsește o permutare p1,p2,...,pnp_1, p_2, ..., p_n de grad n. Acesta poate să modifice orice element al permutării, dar cu un cost. Astfel acesta alege pip_i și dd, astfel încât 1in1 \leq i \leq n și dd divide pip_i, iar pip_i se va modifica în dd, cu costul pidp_i \oplus d. Toată lumea știe că lui nu îi place dezordinea. Acesta vrea să găsească costul minim pentru a obține un șir sortat crescător, nu neapărat strict, după finalul tuturor modificărilor. Totuși nu este tipul care ar implementa Slope-Trick la Marytone și decide să vă ceară ajutorul.

Cerință

Fiind date nn si permutarea pp, ajutați-l pe Omul fantastic.

Date de intrare

Fișierul de intrare divixori.in conține pe prima linie un număr natural nn. Pe a doua linie se vor afla nn numere naturale, p1,p2,...,pnp_1, p_2, ..., p_n, reprezentând elementele permutării pp.

Date de ieșire

Fișireul de ieșire divixori.out conține un număr natural reprezentând costul minim pentru a obține un șir sortat crescător, nu neapărat strict, după finalul tuturor modificărilor.

Restricții și precizări

  • 1n1061 \leq n \leq 10^6
  • 1pin,1in1 \leq p_i \leq n, 1 \leq i \leq n
  • Definiția operației \oplus
  • Atenție! Cerința este să implementați funcția solve(). Codul pe care îl veți trimite nu va conține functia main() — aceasta va fi înlocuită de funcția solve(). Iată un exemplu de un program valid:
long long solve(int n, int p[]) {
	return 0;
}
  • Pentru teste în valoare de 10p10p avem 1n101 \leq n \leq 10
  • Pentru teste în valoare de 20p20p avem 1n1031 \leq n \leq 10^3
  • Pentru teste în valoare de 30p30p avem 1n1051 \leq n \leq 10^5
  • Pentru teste în valoare de 20p20p avem 1n5×1051 \leq n \leq 5 \times 10^5
  • Pentru teste în valoare de 20p20p avem 1n1061 \leq n \leq 10^6

Exemplul 1

divixori.in

6
1 4 2 3 6 5

divixori.out

10

Exemplul 2

divixori.in

6
6 5 4 3 2 1

divixori.out

21

Explicații

Pentru primul exemplu putem modifica p5p_5 din 66 în 33 și p2p_2 din 44 în 11, costul total fiind 63+41=106 \oplus 3 + 4 \oplus 1 = 10.
Pentru al doilea exemplu singura modalitate este să modificăm toate elementele în 11, costul total fiind 2121.

Log in or sign up to be able to send submissions!