Pe Marte s-au descoperit N
marțieni, identificați de către oamenii de știință de pe Pământ prin numerele de la 1
la N
. Cercetările au dovedit că ADN-ul oricărui marțian X
este format din mulțimea factorilor primi din descompunerea lui X
. De exemplu ADN(6)={2,3}
.
Se știe că marțianul cu numărul de ordine Y
îl moștenește pe marțianul cu numărul de ordine X
dacă ADN(X)
este inclus în ADN(Y)
, adică mulțimea factorilor primi ai lui X
este inclusă în mulțimea factorilor primi ai lui Y
.
De exemplu, marțianul 6
îl moștenește pe marțianul 3
deoarece ADN(3)={3}
este inclus în ADN(6)={2,3}
.
Trebuie să specificăm că se pot întâlni situații extreme în care X
îl moștenește pe Y
dar și Y
îl moștenește pe X
, atunci când cei doi marțieni au ADN-urile egale. Este situația marțianului 12
care îl moștenește pe 6
dar și 6
îl moștenește pe 12
.
Cerința
Realizați un program care, considerând mulțimea celor N
marțieni, determină numărul de perechi de marțieni (Y, X)
pentru care Y
îl moștenește pe X
, unde 1 ≤ X ≤ N
și 1 ≤ Y ≤ N
.
Date de intrare
Fișierul de intrare adn.in
conține pe prima linie numărul N
, reprezentând numărul de marțieni.
Date de ieșire
Fișierul de ieșire adn.out
va conține pe prima linie numărul de perechi determinat.
Restricții și precizări
1 ≤ N ≤ 5 000 000
- Pe planeta Marte orice marțian
X
îl moștenește peX
. - Orice marțian îl moștenește pe marțianul
1
deoareceADN(1)={}
, adică mulțimea vidă, care se consideră inclusă în orice mulțime nevidă. - Se garantează că numărul de perechi determinat are cel mult nouă cifre.
Exemplul 1
adn.in
6
adn.out
16
Explicație
ADN(1)={}
, ADN(2)={2}
, ADN(3)={3}
, ADN(4)={2}
, ADN(5)={5}
, ADN(6)={2,3}
.
Perechile de marțieni determinate sunt (1,1)
; (2,2)
; (3,3)
; (4,4)
; (5,5)
; (6,6)
; (4,2)
; (2,4)
; (6,2)
; (6,3)
; (6,4)
; (2,1)
; (3,1)
; (4,1)
; (5,1)
; (6,1)
.
Exemplul 2
adn.in
19
adn.out
88
Exemplul 3
adn.in
38
adn.out
251
Exemplul 4
adn.in
99
adn.out
961
#include <bits/stdc++.h> using namespace std; ifstream cin("adn.in"); ofstream cout("adn.out"); int n , D[5000001]; long long c; int main() { cin >> n; for(int i = 1 ; i <= n ; i++) D[i] = 1; for(int i = 2 ; i <= n ; i++) if(D[i] == 1) { D[i] = i; for(int j = 2 ; j * i <= n ; j++) D[i*j] *= i; } for(int i = 1 ; i <= n ; i++) c += n / D[i]; cout << c; }