题目大意
求 n n n 以内有多少个完全平方数或完全立方数。
1 ≤ n ≤ 1 0 9 1 \leq n \leq 10^9 1≤n≤109。
解题思路
考虑容斥。
n n n 以内是完全平方数或完全立方数的数的个数 = = = n n n 以内是完全平方数的数的个数 + + + n n n 以内是完全立方数的数的个数 − - − n n n 以内是完全平方数且是完全立方数的数的个数。
显然, n n n 以内是完全平方数的数的个数 = n 2 =\sqrt[2]{n} =2n, n n n 以内是完全立方数的数的个数 = n 3 =\sqrt[3]{n} =3n。
再看 n n n 以内是完全平方数且是完全立方数的数的个数,考虑找性质。
发现,将 n n n 唯一分解为 ∏ i = 1 k p i a i \prod\limits_{i=1}^{k}p_i^{a_i} i=1∏kpiai,其中 p i p_i pi 为质数且互不相等。
当 ∀ 1 ≤ i ≤ k , a i ≡ 0 ( m o d 2 ) \forall 1 \leq i\leq k,a_i \equiv 0 \pmod 2 ∀1≤i≤k,ai≡0(mod2) 时, n n n 为完全平方数。
当 ∀ 1 ≤ i ≤ k , a i ≡ 0 ( m o d 3 ) \forall 1 \leq i\leq k,a_i \equiv 0 \pmod 3 ∀1≤i≤k,ai≡0(mod3) 时, n n n 为完全立方数。
那么当 n n n 是完全平方数且是完全立方数时,肯定满足: ∀ 1 ≤ i ≤ k , a i ≡ 0 ( m o d 6 ) \forall 1 \leq i\leq k,a_i \equiv 0 \pmod 6 ∀1≤i≤k,ai≡0(mod6),那么发现什么, n n n 是完全六次方数。
那么 n n n 以内是完全平方数且是完全立方数的数的个数,就转换成 n n n 以内是完全六次方数的数的个数,也就是 n 6 \sqrt[6]{n} 6n。
那就结束了,答案为 n 2 + n 3 − n 6 \sqrt[2]{n}+\sqrt[3]{n}-\sqrt[6]{n} 2n+3n−6n。
转换为
n
1
2
+
n
1
3
−
n
1
6
n^{\frac{1}{2}}+n^{\frac{1}{3}}-n^{\frac{1}{6}}
n21+n31−n61,用 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;
}