Cerința
Îl cunoașteți, cred, pe Cătălin, fan-ul numărul 1 al greșelilor. Ei bine, în teza la mate, Cătălin a făcut N greșeli. Presupunând, prin reducere la absurd, că el corectează o greșeală i, poate alege să corecteze o singură greșeală j, cu proprietatea 1<j<i şi i%j=0. El știe că, dacă face această alegere poate să continue din greșeala j, după aceeași regulă și nu mai poate reveni la o greșeala anterioară.
Cătălin alege T greșeli G[1] G[2] … G[T] și dorește să știe, pentru fiecare G[i], numărul maxim de greșeli pe care le poate corecta dacă începe rezolvând-o pe aceasta.
Date de intrare
Fișierul de intrare greselile.in conține pe prima linie două numere N și T unde N este numărul de greșeli și T numărul de întrebări. Următoarele T linii conțin câte un număr natural nenul reprezentând greșeala de la care Cătălin vrea să pornească corectarea.
Date de ieșire
Fișierul de ieșire greselile.out va conține fiecare linie i un singur număr natural reprezentând numărul maxim de greșeli care pot fi corectate dacă ar începe Cătălin cu greșeala G[i].
Restricții și precizări
1 ≤ N, T ≤ 1.000.000
Exemplu
greselile.in
10 9 3 4 6 2 5 7 8 9 10
greselile.out
1 2 2 1 1 1 3 2 2
Explicație
Corectează doar 3 deoarece numărul nu are divizori proprii.
Pornind cu 4 el va corecta 4 şi 2.
Pornind cu 6 el va corecta 6 şi 3 sau 6 și 2, maximul fiind de 2 greşeli corectate.
ș.a.m.d.
#include <bits/stdc++.h>
using namespace std;
ifstream cin("greselile.in");
ofstream cout("greselile.out");
bitset<1000001> V;
int P[1000001], nrp, D[1000001];
void eratostene(){
V[1]=V[0]=1;
for(int i = 2; i <= 1001; ++i)
for(int j = 2; j * i <= 1000001; j++)
V[j * i] = 1;
for(int i = 1; i <= 1000001; ++i)
if(V[i] == 0)
P[++nrp] = i;
}
int n, t;
int desc(int n){
int d = 1, cnt = 0;
while(n > 1){
int p = 0;
while(n % P[d] == 0)
p++, n /= P[d];
cnt += p;
d++;
if(P[d] * P[d] > n && n != 1){
cnt++;
return cnt;
}
}
return cnt;
}
int main(){
eratostene();
cin >> n >> t;
for(int i = 1; i <= n; ++i)
D[i] = desc(i);
int x;
for(int i = 1; i <= t; ++i)
cin >> x , cout << D[x] << '\n';
return 0;
}