CF1619B Squares and Cubes

题目大意

nn 以内有多少个完全平方数或完全立方数。

1n1091 \leq n \leq 10^9

解题思路

考虑容斥。

nn 以内是完全平方数或完全立方数的数的个数 == nn 以内是完全平方数的数的个数 ++ nn 以内是完全立方数的数的个数 - nn 以内是完全平方数且是完全立方数的数的个数。

显然,nn 以内是完全平方数的数的个数 =n2=\sqrt[2]{n}nn 以内是完全立方数的数的个数 =n3=\sqrt[3]{n}

再看 nn 以内是完全平方数且是完全立方数的数的个数,考虑找性质。

发现,将 nn 唯一分解为 i=1kpiai\prod\limits_{i=1}^{k}p_i^{a_i},其中 pip_i 为质数且互不相等。

1ik,ai0(mod2)\forall 1 \leq i\leq k,a_i \equiv 0 \pmod 2 时,nn 为完全平方数。

1ik,ai0(mod3)\forall 1 \leq i\leq k,a_i \equiv 0 \pmod 3 时,nn 为完全立方数。

那么当 nn 是完全平方数且是完全立方数时,肯定满足:1ik,ai0(mod6)\forall 1 \leq i\leq k,a_i \equiv 0 \pmod 6,那么发现什么,nn 是完全六次方数。

那么 nn 以内是完全平方数且是完全立方数的数的个数,就转换成 nn 以内是完全六次方数的数的个数,也就是 n6\sqrt[6]{n}

那就结束了,答案为 n2+n3n6\sqrt[2]{n}+\sqrt[3]{n}-\sqrt[6]{n}

转换为 n12+n13n16n^{\frac{1}{2}}+n^{\frac{1}{3}}-n^{\frac{1}{6}},用 pow 函数算即可。

注意精度问题。

CODE

#include <bits/stdc++.h>

using namespace std;

signed main()
{
    int T;
    cin >> T;
    while (T --)
    {
        double n;
        cin >> n;
        n += (0.00001);
        cout << int(pow(n, 1.0 / 2)) + int(pow(n, 1.0 / 3)) - int(pow(n, 1.0 / 6)) << endl;
    }
    return 0;
}
posted @ 2021-12-28 18:35  蒟蒻orz  阅读(1)  评论(0编辑  收藏  举报  来源