CF1619B Squares and Cubes

题目大意

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

1 ≤ n ≤ 1 0 9 1 \leq n \leq 10^9 1n109

解题思路

考虑容斥。

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=1kpiai,其中 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 1ik,ai0(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 1ik,ai0(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 1ik,ai0(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+n31n61,用 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;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值