hdu3826 Squarefree number

博客介绍了如何使用质数筛法解决HDU3826题目,该题目要求判断2到10^6范围内的数是否含有能开完全平方的因子。虽然作者使用的筛法效率低于欧拉筛,但已足够得到正确答案。
摘要由CSDN通过智能技术生成

题目大意:

给出一个2到10^6范围内的数,问它是否存在能开完全平方的因子。

注释里思路已经给的很清楚了,就不再写了。
题目里我用的质数筛法比较简单,看网上的题解大部分用的欧拉筛,我用的筛法的效率是没有欧拉筛高的,那是真正线性筛法。

AC代码

# include <stdio.h>
# include <string.h>
# include <math.h>
# define LL long long

bool isPrime[1000000];

/*
    直接遍历所有因子会导致超时。(可能也不是TLE,只是我的代码有问题)
    思路:
        题目里里N的最大可能值是10^18。
        1.首先,我们不需要2^2,3^2,4^2,这样每个数都去找,
            因为不是质数,说明本身能够分解,不是质数的平方
            存在,说明有质数的平方存在((2*2)^2,即2^2),只遍历
            质数的平方可以提高效率。
        2.鉴于范围很大,我们还可以做一个优化。
            将10^18开三次方根,也就是10^6,这时候有两种情况:
                (1) 10^6范围中存在质数平方的因数能整除N,直接
                输出结果
                (2) 在N除去10^6范围内的质因子后,剩下的质数因子
                只可能比10^6大或者不存在质数因子了,如果不存在
                质数因子则直接输出结果,否则剩下的数试试能否开
                完全平方即可出结果。
*/

void init() {
   
    memset(isPrime,0,sizeof(isPrime))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值