tags: -分解质因数 , gcd

题目大意

给定\(n\)个数,求\(a_1\)与\(a_i\)次小公约数

分析

易知次小公约数是\(\gcd\)的因数,于是用\(\gcd\)除去它的最小质因子即可。

没有次小公约数的情况是\(\gcd = 1\),特判一下即可

直接枚举的时间复杂度为\(O(n \sqrt a)\)

由于数据规模较大考虑优化

由于是求\(sgcd(a_1,a_i)\)于是结果一定是\(a_1\)的质因数组成,于是预处理\(a_1\)的质因数,然后每次处理时除去最小的即可,\(10^{12}< 2^{38}\)于是可以知道得到质因数的个数小于\(38\)个,于是时间复杂度就变为了\(O(50n)\)啦!

代码

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define LL long long
#define maxn 100010
#define rep(i,a,b) for(int i = a; i <= b ;i++) using namespace std; int n;
LL ys[40]; LL gcd(LL a, LL b) {
while (b ^= a ^= b ^= a %= b);
return a;
} int main(){
scanf("%d",&n); LL l,tmp; int tot = 0;
scanf("%lld", &l);
tmp = l;
for (int i = 2; 1ll * i * i <= l ;i ++)
if (l % i == 0)
{
ys[++tot] = i;
while (l % i == 0) l /= i;
}
if (l != 1) ys[++tot] = l;
l = tmp ;
if (l != 1) printf("%lld ",l / ys[1]);
else printf("-1 "); rep(i,2,n){
LL aa;
scanf("%lld",&aa); LL g = gcd(aa,l);
if (g == 1) printf("-1 ");
else rep (j,1,tot)
if (g % ys[j] == 0 )
{
printf("%lld ",g / ys[j]);
break;
}
} return 0;
}

最新文章

  1. [C#] Linq To Objects - 如何操作字符串
  2. tar 解压bz2报错 Cannot exec: No such file or directory
  3. Undefined symbols “_OBJC_CLASS_$_XXX” 问题
  4. 如何配置magento免运费商品方法
  5. JavaScript原生折叠扩展收缩菜单带缓冲动画
  6. Node 实现 AES 加密,结果输出为“byte”。
  7. Rebind and Rewind in Execution Plans
  8. php后台判断ajax请求
  9. Hibernate的一对多查询及去掉重复的对象distinct
  10. upload三种上传方式(上)---Servlet---post---commons-fileupload.1.2.1.jar方式请求上传文件
  11. Tableau可视化绘图教程
  12. 【BZOJ2823】[AHOI2012]信号塔(最小圆覆盖)
  13. 【PAT】B1054 求平均值(20 分)
  14. kali 开启ssh服务
  15. 编写Shell脚本
  16. 改变PowerDesigner数据模型字体大小
  17. sql server数字转字符串出现科学计数法
  18. spring mvc 注解@Controller @RequestMapping @Resource的详细例子
  19. git入门篇
  20. Cygwin、Msys、MinGW、Msys2的区别与联系(转)

热门文章

  1. Spring 事务传播属性
  2. css animation 复刻
  3. Netty实战学习笔记
  4. 24js Number(数字)对象
  5. vue的增删改查(简单版)
  6. npm查询所有可以安装的包
  7. 事务与spring事务
  8. py09函数简介
  9. kubectl --v日志级别
  10. Python-celery介绍与快速上手