题面

  • t 组数据。

  • 给定参数 p,q,求一个最大的 x,满足 \((x|p)∧(q∤x)\)。

  • \(1\le t \le 500\),\(1\le p \le10^{18}\),\(2\le q\le10^9\),

  • \(1S\),\(512MB\)。

思路

  • 当 \(p < q\) 时 或 \(q∤p\),答案显然是 \(p\),直接输出即可

  • 当 \(q | p\),即 \(q\) 是 \(p\) 的因子时

  • 我们可以将 \(p\) , \(q\) 质因数分解,让 \(p\) 去除以 \(q\)的质因子,直到 \(p\) 不能被 \(q\) 整除,

  • \(p\) 中比 \(q\) 大的质因子是对上面没有影响的,因此仅考虑\(q\) 的质因子

  • 相比于删除多种质因子,只删一种的方案更优

  • 穷举删除,找到最大值即可

  • 复杂度\(O\) (\(t \sqrt{q}\))


推论

  • 分解质因数 \(p,q,x\)

    \[p=\prod a_i^{b_1}
    \]
    \[q=\prod a_i^{b_2}
    \]
    \[x=\prod a_i^{b_3}
    \]
  • 因为条件是 \((x|p)∧(q∤x)\) 即:

    \[p = k \times x =k\times \prod a_i^{b_3}(k\in N^*)
    \]
    \[∃a_i|q,b_3<b_2
    \]
  • 换句话说, \(x\) 中的包含 \(q\) 中的质因子,且质因子数量 \(<q\),可以为 \(0\)

  • 因此要找的 \(x\) 就是 \(p\) 中删除部分质因子后的数,使得达到上述条件

  • 相比删除多种,只需使一种质因子数量不满足上述条件即可,即只删一种

  • 枚举 \(q\) 的所有质因子计算即可

Code

#include <iostream>//声明:luckyblock的思路
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cmath>
#define int long long //我用 int 来代替 long long
using namespace std; const int manx=1e6+10;
const int mamx = 1e6 + 11;
const int B = 1e6 + 11;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f; inline int read() {
char c = getchar(); int x = 0, f = 1;
for ( ; !isdigit(c); c = getchar()) if (c == '-') f = -1;
for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
return x * f;
} signed main(){
int t = read();
while(t--){
int ans = 1;
int p = read(),q = read();//看清上边备注,和数据范围
int s = p;
if(p < q){cout<<p<<endl;continue;}
if(p % q != 0){cout<<p<<endl;continue;}
for(int i = 2;i*i <= q; i++){//枚举q中每一个“因子”
if(q%i == 0){
int jsq = 0,jsp = 0;
while(q % i == 0ll){ // 取模最好类型相同
q = q / i;
jsq ++;
}
while(p % i == 0ll){
p /= i;
jsp ++;
}
if(jsp < jsq) continue;//说明该 “因子 ”非 “质因子 ”
int jj = s;//因为 q p 时刻都在更新,所以预处理 用其他变量代替。
for(int k = 1; k <=jsp - jsq + 1;k++){
jj /= i;
}
ans = max(jj,ans);
}
}
if(q != 1){//比q大的质因子,注:此时的p q 以被更新,所存的数中不存在共同的质因子
int jsp = 0;
while(p % q == 0){
p /= q;
jsp++;
}
int jj = s;
for(int i = 1; i <= jsp;i ++){
jj /= q;
}
//cout<<jj<<endl;
ans = max(jj,ans);
}
cout<<ans<<endl;
}
return 0;
}

最新文章

  1. 配置Eclipse编写HTML/JS/CSS/JSP页面的自动提示。
  2. inittab 分析
  3. alu features menu
  4. Hibernate getCurrentSession()和openSession()的区别
  5. REHL5.5 linux的postfix的邮件服务器配置 (笔记)
  6. Github学习之路-小试牛刀,练习Git 的基本操作
  7. ubuntu 软件安装的几种方法
  8. delphi 中字符串与16进制、10进制转换函数
  9. PHP 性能分析第二篇: Xhgui In-Depth
  10. gcc 编译和链接
  11. python_如何快速下载安装第三方库?
  12. python使用正则解析网络地址的各个部分
  13. gogs 安装
  14. Day 4-9 subprocess模块
  15. Springboot -- 由于jar版本不匹配遇到的问题
  16. day--16页面布局
  17. UnicodeString基本操作(Ring0)
  18. sql server 2008 身份验证失败 18456
  19. 将ssh失败的用户放入hosts.deny中
  20. php语言介绍分析

热门文章

  1. java中将信息写入excel
  2. 看了CopyOnWriteArrayList后自己实现了一个CopyOnWriteHashMap
  3. [学习笔记]尝试go-micro开发微服务&lt;第一波&gt;
  4. linux下用户管理命令、用户组管理命令
  5. Phoneix(二)HBase集成Phoenix安装
  6. new ArrayList(0) 和 new ArrayList() 和一样吗?
  7. .NET的并发编程(TPL编程)是什么?
  8. Python列表推导式玩法
  9. SQL查找连续出现的数字
  10. scp传文件夹