博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ HDOJ 3826 ] Squarefree number
阅读量:6314 次
发布时间:2019-06-22

本文共 998 字,大约阅读时间需要 3 分钟。

\(\\\)


\(T\)组数据,每次给出一个正整数 \(N\) ,判断其是否能被任意一个完全平方数整除。

  • \(T\le 20,N\le 10^{18}\)

\(\\\)

\(Solution\)


比较巧妙。

考虑一个数能被完全平方数整除,当且仅当对其分解质因数以后,至少有一个质数的指数\(\ge 2\)

借用试除法分解质因数的思路,大于\(\sqrt N\)的质因子至多只有一个。那么,大于 \(\sqrt[3] N\) 的质因数的平方整除 \(N\) 的个数至多也只有一个,而且指数至多为 \(2\) ,因为指数再大或者再乘上一个等数量级的完全平方数都会超过 \(10^{18}\) 的数据范围。

然后就筛出 \(\sqrt[3] {10^{18}}=10^6\) 范围内的质数,然后将 \(N\)\([0,10^6]\) 范围内的质因子去掉。在这一过程中一旦出现指数大于 \(2\) 的情况就直接 \(GG\) 。然后剩下的如果是大于 \(1\) 的话就 \(check\) 一下是不是完全平方数就好了。

\(\\\)

\(Code\)


#include
#include
#include
#include
#include
#include
#include
#define N 1000010#define R register#define gc getcharusing namespace std;typedef long long ll;inline ll rd(){ ll x=0; bool f=0; char c=gc(); while(!isdigit(c)){if(c=='-')f=1;c=gc();} while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();} return f?-x:x;}bool vis[N];ll prm[N];inline void init(){ for(R ll i=2;i

转载于:https://www.cnblogs.com/SGCollin/p/9791859.html

你可能感兴趣的文章
shell脚本操作mysql数据库 (部份参考)
查看>>
MySql之基于ssl安全连接的主从复制
查看>>
informix的逻辑日志和物理日志分析
查看>>
VMware.Workstation Linux与windows实现文件夹共享
查看>>
ARM inlinehook小结
查看>>
wordpress admin https + nginx反向代理配置
查看>>
管理/var/spool/clientmqueue/下的大文件
查看>>
HTML学习笔记1—HTML基础
查看>>
mysql dba系统学习(20)mysql存储引擎MyISAM
查看>>
centos 5.5 64 php imagick 模块错误处理记录
查看>>
apache中文url日志分析--php十六进制字符串转换
查看>>
Ansible--playbook介绍
查看>>
浅谈代理
查看>>
php创建桌面快捷方式实现方法
查看>>
基于jquery实现的超酷动画源码
查看>>
fl包下的TransitionManager的使用
查看>>
Factorialize a Number
查看>>
[USB-Blaster] Error (209040): Can't access JTAG chain
查看>>
TreeSet的用法
查看>>
防HTTP慢速攻击的nginx安全配置
查看>>