a53

Forta

a53
Mar 11th, 2020
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.04 KB | None | 0 0
  1. //marinel februarie 2020
  2. #include <fstream>
  3. #include <cstring>
  4.  
  5. using namespace std;
  6.  
  7. ifstream fin("forta.in");
  8. ofstream fout("forta.out");
  9.  
  10. #define dim 100001
  11.  
  12. struct elem
  13. {
  14. int X;
  15. short int nrdiv;
  16. } divi[dim];
  17.  
  18. int X, x, cx, d, cerinta, n, nrd_citit, i, imax, mic, m;
  19. int Pmax, nr_max, p, u, cate, cate_max, pmax, umax, Fmax;
  20. int F[dim], P[45001];
  21. char C[45001];
  22.  
  23. int nrD(int n)
  24. {
  25. int k = 1, p, d = 1; //folosesc formula d = (p1+1)(p2+1)...(pk+1)
  26. while (P[k] * P[k] <= n) //unde p1 p2...pk sunt puterile factorilor primi
  27. { //din descompunere
  28. p = 0; //initializez puterea
  29. while (n % P[k] == 0) //cat timp se divide cu numarul prim P[k]
  30. {
  31. n /= P[k]; //imparte
  32. p++; //numara
  33. }
  34. d = d * (p + 1); //formula
  35. k++; //trec la alt numar prim
  36. }
  37. if(n > 1) //daca a mai ramas ceva din n => este numar prim
  38. d = d * 2; //deci d se inmulteste cu (1+1) = 2
  39. return d; //returnez numarul de divizori
  40. }
  41.  
  42. void ciur()
  43. {
  44. int i, j; //pentru determinarea numarului de divizori
  45. C[0] = C[1] = 1; //voi folosi DOAR numere prime impare
  46. for (i = 2; i < 45001; i ++) //suficient 45001 deoarece
  47. if (C[i] == 0) //45000 * 45000 = 2025000000 > 2000000000
  48. { //am un numar prim
  49. m++; //il numar si
  50. P[m] = i; //il salvez apoi elimin multipli
  51. for (j = i * i; j < 45001; j += i)
  52. C[j] = 1;
  53. }
  54. }
  55.  
  56. int main()
  57. {
  58. fin >> cerinta; //citire cerinta si
  59. fin >> n; //numarul de numere
  60. ciur(); //construiesc sirul numerelor prime
  61. for (i = 1; i <= n; i++) //iau pe rand cele n numere
  62. {
  63. fin >> X; //citesc numarul
  64. divi[i].nrdiv = nrD(X); //calculez si retin numarul de divizori
  65. divi[i].X = X; //retin si numarul
  66. F[divi[i].nrdiv]++; //contorizez numarul de aparitii a numaruui de divizori
  67. if (F[divi[i].nrdiv] > Fmax) //determin numarul maxim de aparitii
  68. Fmax = F[divi[i].nrdiv];
  69. if (divi[i].nrdiv > Pmax) //determin si numarul maxim de divizori
  70. {
  71. Pmax = divi[i].nrdiv; //retin
  72. nr_max = X; //retin si pentru cine este acesta
  73. }
  74. else
  75. if (divi[i].nrdiv == Pmax) //in caz de egalitate
  76. {
  77. if (X < nr_max) //caut numarul mai mic
  78. nr_max = X;
  79. }
  80. }
  81. if (cerinta == 1)
  82. fout << nr_max << '\n'; //afisez cerinta 1
  83. else
  84. fout << Fmax << '\n'; //afisez cerinta 2
  85. return 0;
  86. }
Add Comment
Please, Sign In to add comment