fork download
  1. #include <iostream>
  2. #include <cstring>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. const int MAX = 1e5;
  8. const int LIM = MAX + 15;
  9.  
  10. vector<int> prime; // tập các số nguyên tố từ 2 tới lim
  11. vector<int> lpf; // lowest_prime_factor[x] trả về ước nguyên tố nhỏ nhất của x
  12. vector<bool> is_prime;
  13. int sieve(int lim = MAX)
  14. {
  15. if (lim <= 1) {
  16. return 0;
  17. }
  18. prime.assign(1, 2);
  19. lpf.assign(lim + 1, 2);
  20. is_prime.assign(lim + 1, true);
  21.  
  22. lpf[1] = 1;
  23. for (int i = 3; i <= lim; i += 2) {
  24. if (is_prime[i]) {
  25. prime.push_back(lpf[i] = i);
  26. }
  27. for (int j = 0; j < prime.size() && prime[j] <= lpf[i] && prime[j] * i <= lim; ++j) {
  28. lpf[prime[j] * i] = prime[j];
  29. is_prime[prime[j] * i] = false;
  30. }
  31. }
  32. return prime.size();
  33. }
  34.  
  35. int Mask(int x)
  36. {
  37. int mask = 1;
  38. while (x > 1)
  39. {
  40. int p = lpf[x], f = 0; // p^f
  41. do x /= p, ++f; while (p == lpf[x]);
  42. const int r = f % 2;
  43. if (r == 1) {
  44. mask *= p;
  45. }
  46. }
  47. return mask;
  48. }
  49.  
  50. int cnt[LIM];
  51. long long solve(int n)
  52. {
  53. memset(cnt, 0, sizeof(cnt[0]) * (n + 1));
  54. sieve(n);
  55.  
  56. long long res = 0;
  57. for (int x = 1; x <= n; ++x) {
  58. res += cnt[Mask(x)]; // Ghép U với tất cả Y = V * Q^2 có Mask(X) = Mask(Y)
  59. ++cnt[Mask(x)]; // Tìm được thêm một giá trị X = U * P^2 với U = Mask(X)
  60. }
  61.  
  62. return res;
  63. }
  64.  
  65. int main()
  66. {
  67. for (int n = 1; n <= 100; ++n) {
  68. cout << solve(n) << " ";
  69. }
  70. cout << endl;
  71. return 0;
  72.  
  73. for (int n; cin >> n; ) {
  74. cout << solve(n) << endl;
  75. }
  76. return 0;
  77. }
Success #stdin #stdout 0.01s 5324KB
stdin
Standard input is empty
stdout
0 0 0 1 1 1 1 2 4 4 4 5 5 5 5 8 8 10 10 11 11 11 11 12 16 16 18 19 19 19 19 22 22 22 22 27 27 27 27 28 28 28 28 29 31 31 31 34 40 44 44 45 45 47 47 48 48 48 48 49 49 49 51 58 58 58 58 59 59 59 59 64 64 64 68 69 69 69 69 72 80 80 80 81 81 81 81 82 82 84 84 85 85 85 85 88 88 94 96 105