题目大意:
给出一个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))