fork download
  1. #include <cstdio>
  2. #include <unordered_map>
  3. #define lint long long
  4. #define MAX 300003
  5.  
  6. lint mu[MAX] = {0, 1}; // 편의상 mu[0] = 0이라 둔다.
  7. std::unordered_map<int, lint> mp;
  8.  
  9. lint S(int x) {
  10. int i, j;
  11. if (x < MAX) return mu[x];
  12. if (mp.find(x) != mp.end()) return mp[x];
  13. lint ret = 1;
  14. for (i = 2; i <= x; i = j+1) {
  15. j = x / (x / i);
  16. ret -= (j - i + 1) * S(x / i);
  17. }
  18. return mp[x] = ret;
  19. }
  20.  
  21. int main()
  22. {
  23. int N, i, j;
  24. scanf("%d", &N);
  25.  
  26. for (i = 1; i < MAX; ++i) {
  27. for (j = 2; j*i < MAX; ++j) mu[j*i] -= mu[i];
  28. mu[i] += mu[i-1];
  29. }
  30.  
  31. printf("%lld", S(N));
  32. return 0;
  33. }
Success #stdin #stdout 0.11s 5664KB
stdin
1000000000
stdout
-222