题目

将 $n$($1 < n \leq 10^{18}$)质因数分解,求质因数幂的最小值。

分析

直接质因数分解,不太行。

可以这样想,对小区间质因数分解,n变小了,再枚举答案。

打印1-10000之间的素数表然后质因数分解,分解完剩下的那个数,

  • 两种质数(肯定大于 $10^4$)相乘,最多二次,合起来也是一个平方数;
  • 三种或以上质数相乘,只可能为一次,不用考虑。
  • 一种质数,最多为四次方,枚举四、三、二次方,如果都不是,就是单个质数

要注意:先看是4次方再看2次方(因为如果满足4次方一定满足2次方,但是满足4次方也满足2次方,2次方的话就不是质因数了),3次方无所谓,因为开3次方会损失精度,所以就二分一下。

#include<bits/stdc++.h>
using namespace std; typedef long long ll;
ll n; //返回n以内素数的个数
//埃氏筛法O(nloglogn)
const int maxn = + ;
int prime[maxn]; //prime[i]表示第i个素数
bool is_prime[maxn + ]; //is_prime[i]为true表示i是素数 int sieve(int n)
{
int cnt = ;
for (int i = ; i <= n; i++) is_prime[i] = true;
is_prime[] = is_prime[] = false;
for (int i = ; i <= n; i++)
{
if (is_prime[i])
{
prime[cnt++] = i;
for (int j = i * i; j <= n; j += i) is_prime[j] = false; //i * i可能爆int
}
}
return cnt;
} bool is_three(ll n) //是否能开立方
{
ll l = , r = 1e6;
while(l <= r)
{
ll mid = (l+r) >> ;
ll tmp = mid*mid*mid;
if(tmp == n) return true;
else if(tmp > n) r = mid-;
else l = mid+;
}
return false;
} int main()
{
int cnt = sieve(); //筛出10000内的质数
int T;
scanf("%d", &T);
while(T--)
{
scanf("%lld", &n);
int ans = ;
for(int i = ;i < cnt;i++)
{
if(n % prime[i] == )
{
int tmp = ;
while(n % prime[i] == )
{
n /= prime[i];
tmp++;
}
ans = min(tmp, ans);
}
if(n == ) break;
}
if(ans == ){ printf("1\n"); continue;}
if(n == ){ printf("%d\n", ans); continue;} ll t1 = (ll)sqrt(n);
ll t2 = (ll)sqrt(t1);
if(t2*t2*t2*t2 == n) ans = min(ans, );
else if(t1*t1 == n) ans = min(ans, );
else if(is_three(n)) ans = min(ans , );
else ans = min(ans, );
printf("%d\n", ans);
}
return ;
}

参考链接:https://blog.csdn.net/lgz0921/article/details/97948432

最新文章

  1. geotrellis使用(十四)导出定制的GeoTiff
  2. 第二轮冲刺-Runner站立会议04
  3. 【LeetCode】Roman to Integer &amp; Integer to Roman
  4. Java设计模式之代理模式
  5. python基础——定制类
  6. hihoCoder 1160 攻城略地
  7. PS拾色器(前景色背景色)快捷键
  8. Spark1.2新特性概述
  9. android 如何进入某个具体的应用管理页面
  10. iOS AFNetworking 详解
  11. java学习之二叉树的实现
  12. kali客户端攻击
  13. Akka-CQRS(0)- 基于akka-cluster的读写分离框架,构建gRPC移动应用后端架构
  14. ASP.NET -- WebForm -- 给图片添加水印标记
  15. Dart编程语言入门
  16. zzw_rsync命令中的/的作用
  17. vue用组件构建应用
  18. 利用FFMPEG命令进行文件分割
  19. 《Linux内核分析》第五周
  20. HDU 2073 无限的路 (模拟)

热门文章

  1. pandas 索引笔记
  2. SAS学习笔记35 options语句
  3. 定义别名:typedef和using
  4. Kafka集群安装及prometheus监控
  5. .NET CORE 下 MariaDB DBfirst 生成model层 并配置连接参数
  6. HelenOS
  7. 针对IE6 7 8当独写样式
  8. node express4 + 前端自动刷新
  9. form表单详解
  10. 软件打包 Inno