a53

Pericol

a53
May 7th, 2019
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.77 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int main()
  5. {
  6. ifstream cin("pericol.in");
  7. ofstream cout("pericol.out");
  8.  
  9. int n; cin >> n;
  10. vector<int> v(n);
  11. for (auto& it : v)
  12. cin >> it;
  13.  
  14. int vmax = *max_element(v.begin(), v.end()) + 5;
  15. vector<int> frecv(vmax);
  16. for (auto&& it : v)
  17. frecv[it]++;
  18.  
  19. int elementarCount = 0;
  20. vector<int> elementars(vmax);
  21. vector<bool> cannotElementar(vmax);
  22. vector<int> countMult(vmax);
  23. vector<int> isPrime(vmax, true); isPrime[1] = false;
  24. vector<int> sign(vmax, 1);
  25. vector<int> maxMult(vmax);
  26. for (int i = 1; i < vmax; ++i) {
  27. if (!cannotElementar[i])
  28. elementars[elementarCount++] = i;
  29. if (isPrime[i]) {
  30. if (1LL * i * i < vmax) {
  31. for (int j = i * i; j < vmax; j += i*i)
  32. cannotElementar[j] = true;
  33. }
  34. }
  35. for (int j = i; j < vmax; j += i) {
  36. countMult[i] += frecv[j];
  37. if (frecv[j])
  38. maxMult[i] = max(maxMult[i], j);
  39. if (isPrime[i]) {
  40. sign[j] *= -1;
  41. if (j != i)
  42. isPrime[j] = false;
  43. }
  44. }
  45. }
  46. vector<long long> coef(vmax);
  47. for (int i = 0; i < elementarCount; ++i) {
  48. int elem = elementars[i];
  49. for (int p = elem; p < vmax; p += elem)
  50. coef[p] += 1LL * sign[elem] * (p / elem);
  51. }
  52.  
  53. vector<long long> raspuns(vmax);
  54. for (int p = 1; p < vmax; ++p) {
  55. for (int i = p; i < vmax; i += p) {
  56. raspuns[i] += coef[p] * countMult[p];
  57. }
  58. }
  59.  
  60. for (int i = 0; i < n; ++i)
  61. cout << raspuns[v[i]] - v[i] << ' ';
  62. cout << '\n';
  63.  
  64. return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment