题意

给定一个 \(p (p\le 10^{18})\), 一个 \(q(q \le 10^9)\), 要找到一个最大的 \(x\) 满足:

  1. \(p \%x = 0\)
  2. \(q \% x \neq 0\)

分析

直接枚举 \(p\) 的因数不可取,复杂度为 \(O(\sqrt p)\)。需要另辟蹊径。

容易发现,若 \(p\%q \neq 0\) ,那么答案即为 \(p\)

接下来考虑 \(p\%q = 0\) 的情况。

考虑到唯一分解的定理对于任意一个大于 1 的数字 n 都有

\[n = q_1^{c_1}q_2^{c_2}\cdots q_n^{c_n}
\]

其中 \(q_i\) 为 \(n\) 的质因数,\(c_i\) 为其指数。

如果一个整数 \(n\) 不能被 \(m\) 整除,那么肯定有一个质数 \(e\),它在 \(n\) 中的指数小于在 \(m\) 中的指数。例如 \(12 = 2^2*3^1\) 与 \(8 = 2^3 * 3^0\)。

然后我们枚举这个 \(e\),它必定是 \(q\) 的一个质因数,所以我们枚举 \(q\) 的质因子 \(e\),然后不断的让 \(p\) 除以 \(e\),直到 \(p\%q\neq 0\),此时的 \(p\) 就是满足题目要求的 \(x\),最后在所有的情况中取一个最大的 \(x\) 即可。

单组询问复杂度 \(O(\sqrt q)\)

int T;
ll p, q; ll gcd(ll a, ll b){
return b == 0 ? a : gcd(b, a % b);
}
void solve(ll t){
ll res = 0;
// 枚举 q 的质因数
for(int i = 2; i * i <= t;i++){
if(t % i) continue;
ll now = p; // 尝试不断的用 i 去除 p, 直到 p % q != 0
while(now % q == 0) now /= i;
while(t % i == 0) t /= i;
res = max(res, now);
}
if(t > 1){ // 质因数分解的最后一步
ll now = p;
while(now % q == 0) now /= t;
res = max(res, now);
}
printf("%lld\n", res);
}
int main(){
cin >> T;
while(T--){
scanf("%lld%lld", &p, &q);
if(p % q == 0) {
solve(q);
} else {
printf("%lld\n", p);
}
}
return 0;
}

贴一下官方题解,原理与上述一致。

CF-1445 C - Division 数论,质因数,唯一分解定理的更多相关文章

  1. hdu 1215 求约数和 唯一分解定理的基本运用

    http://acm.hdu.edu.cn/showproblem.php?pid=1215 题意:求解小于n的所有因子和 利用数论的唯一分解定理. 若n = p1^e1 * p2^e2 * ……*p ...

  2. UVA10791-Minimum Sum LCM(唯一分解定理基本应用)

    原题:https://vjudge.net/problem/UVA-10791 基本思路:1.借助唯一分解定理分解数据.2.求和输出 知识点:1.筛法得素数 2.唯一分解定理模板代码 3.数论分析-唯 ...

  3. 简单数论之整除&质因数分解&唯一分解定理

    [整除] 若a被b整除,即a是b的倍数,那么记作b|a("|"是整除符号),读作"b整除a"或"a能被b整除".b叫做a的约数(或因数),a ...

  4. B - Common Divisors (codeforces)数论算法基本定理,唯一分解定理模板

    You are given an array aa consisting of nn integers. Your task is to say the number of such positive ...

  5. FZU 1075 分解素因子【数论/唯一分解定理/分解素因子裸模板】

    [唯一分解定理]:https://www.cnblogs.com/mjtcn/p/6743624.html 假设x是一个正整数,它的值不超过65535(即1<x<=65535),请编写一个 ...

  6. HDU-1215 七夕节 数论 唯一分解定理 求约数之和

    题目链接:https://cn.vjudge.net/problem/HDU-1215 题意 中文题,自己去看吧,懒得写:) 思路 \[ Ans=\prod \sum p_i^j \] 唯一分解定理 ...

  7. AtCoder - 2286 (数论——唯一分解定理)

    题意 求n!的因子数%1e9+7. 思路 由唯一分解定理,一个数可以拆成素数幂之积,即2^a * 3^b *……,n!=2*3*……*n,所以计算每个素因子在这些数中出现的总次数(直接对2~n素因子分 ...

  8. POJ1845Sumdiv(求所有因子和 + 唯一分解定理)

    Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 17387   Accepted: 4374 Descripti ...

  9. POJ - 1845 G - Sumdiv (唯一分解定理)

    Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. Determine S m ...

  10. hdu3826-Squarefree number-(欧拉筛+唯一分解定理)

    Squarefree number Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

随机推荐

  1. 项目中处理数据常用Excel公式

    ="'"&A1&"'," 需求:是大佬给了excel,里面是700多个单号,要我从生产的数据库中查询出每个单号对应的类型,这时需要查数据库,我决 ...

  2. #2020征文-开发板#使用Python开发鸿蒙应用--2021.01.07直播图文

    写在前面: 每年的过年前夕,手中的项目一定会告急...而自己又缺乏三头六臂七十二变等特技,所以只能在鸿蒙社区先消失一阵子了.今天再看社区的帖子,发现大家的进步可不一般,各种案例示例层出不穷,一片欣欣向 ...

  3. 【Flutter】容器类组件之Container容器

    前言 Container是一个组合类容器,它本身不对应具体的RenderObject,它是DecoratedBox.ConstrainedBox.Transform.Padding.Align等组件组 ...

  4. Vim 自动添加脚本头部信息

    每次写脚本还在为忘记添加头部信息啥的烦恼? 按照下面这么做,帮你减轻点烦恼. # 打开配置文件: vim /root/.vimrc # 添加如下信息: autocmd BufNewFile *.sh ...

  5. selenium自动化 | 通过获取cookies登录

    >>>登录百度<<<#获取登录成功后的cookies def get_cookies(): driver.get(bd_url) driver.implicitly ...

  6. Docker构建Python Web环境

    出于寻找Docker对Python相关项目部署的学习,找到腾讯课堂NEXT公开课中[Docker构建Python Web环境]的课程,本文对其进行内容梳理及知识点汇总. 该课程总计6小时左右,是个适合 ...

  7. pidof

    pidof 服务名称,就可以查看到服务占用的进程号

  8. CTFshow萌新赛-web签到

    打开靶机 查看页面信息 可以看到有一个system函数 在Linux中可以使用":"隔离不同的语句 payload如下 https://5105c8b6-83aa-4993-91b ...

  9. JVM 判断对象已死,实践验证GC回收

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 提升自身价值有多重要? 经过了风风雨雨,看过了男男女女.时间经过的岁月就没有永恒不变 ...

  10. Spark底层原理详细解析(深度好文,建议收藏)

    Spark简介 Apache Spark是用于大规模数据处理的统一分析引擎,基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量硬件之上, ...