14248. 珅泽教育CSP-J第一轮模拟考第二十套 第 28 题

珅泽教育CSP-J第一轮模拟考第二十套 第 28 题

阅读程序(二)

假定所需头文件已经包含,n 为正整数,涉及的数组下标合法,输入与运算结果均在 int 的有效范围内;讨论 square_free[60] 时取 n>60。

int solve(int n)
{
    std::vector<int> square_free(n);

    for (int i = 1; i < n; ++i)
        square_free[i] = i;

    for (int p = 2; p * p < n; ++p)
    {
        int p2 = p * p;
        for (int j = p2; j < n; j += p2)
        {
            while (square_free[j] % p2 == 0)
            {
                square_free[j] /= p2;
            }
        }
    }

    int sum = 0;
    std::vector<int> cnt(n, 0);
    for (int i = 1; i < n; ++i)
    {
        sum += cnt[square_free[i]];
        cnt[square_free[i]]++;
    }

    return sum;
}

若 1≤i<n1\le i<n,满足 square_free[i] = 1 的数字个数为( )。

{{ select(1) }}

  • ⌊n⌋−1\lfloor\sqrt n\rfloor-1
  • ⌊n⌋+1\lfloor\sqrt n\rfloor+1
  • ⌊n−1⌋\lfloor\sqrt{n-1}\rfloor
  • ⌊n⌋\lfloor\sqrt n\rfloor