UR #3 核聚变反应强度( gcd )
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;
}
UR #3 核聚变反应强度( gcd )的更多相关文章
- 【uoj#48】[UR #3]核聚变反应强度 数论
题目描述 给出一个长度为 $n$ 的数列 $a$ ,求 $a_1$ 分别与 $a_1...a_n$ 的次大公约数.不存在则输出-1. 输入 第一行一个正整数 $n$ . 第二行 $n$ 个用空格隔开的 ...
- [UR #3] 核聚变反应强度
次大公约数就是gcd再除以其最小质因子(如果有的话).可以发现要求的sgcd 的前身gcd都是a1的约数,所以把a1质因数分解直接做就行了. #include<bits/stdc++.h> ...
- 【UOJ#48】【UR #3】核聚变反应强度(质因数分解)
[UOJ#48][UR #3]核聚变反应强度(质因数分解) 题面 UOJ 题解 答案一定是\(gcd\)除掉\(gcd\)的最小质因子. 而\(gcd\)的最小值因子一定是\(a_1\)的质因子. 所 ...
- uoj 48 核聚变反应强度 次小公因数
[UR #3]核聚变反应强度 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/48 Description 著名核 ...
- [UOJ #48]【UR #3】核聚变反应强度
题目大意:给你一串数$a_i$,求$sgcd(a_1,a_i)$,$sgcd(x,y)$表示$x,y$的次大公约数,若没有,则为$-1$ 题解:即求最大公约数的最大约数,把$a_1$分解质因数,求出最 ...
- [UOJ48] 核聚变反应强度
QUQ 思路 求出a1的所有约数,与a1.ai放入同一数组: 求出gcd(a1,ai): 枚举约数,得出ans; 代码实现 #include<cmath> #include<cstd ...
- 【UOJ Round #3】
枚举/二分 C题太神窝看不懂…… 核聚变反应强度 QwQ很容易发现次小的公约数一定是gcd的一个约数,然后……我就傻逼地去每次算出a[1],a[i]的gcd,然后枚举约数……这复杂度……哦呵呵... ...
- $2018/8/15 = Day \ \ 1$杂题整理
\(\mathcal{Morning}\) \(Task1\)高精度\(\times\)高精度 哦呵呵--真是喜闻乐见啊,我发现这一部分比较有意思于是就打算整理下来233.窝萌现在有一个整数\(A = ...
- 洛谷P2508 [HAOI2008]圆上的整点
题目描述 求一个给定的圆$ (x^2+y^2=r^2) $,在圆周上有多少个点的坐标是整数. 输入格式 \(r\) 输出格式 整点个数 输入输出样例 输入 4 输出 4 说明/提示 \(n\le 20 ...
- 【UOJ#33】【UR#2】树上GCD 有根树点分治 + 容斥原理 + 分块
#33. [UR #2]树上GCD 有一棵$n$个结点的有根树$T$.结点编号为$1…n$,其中根结点为$1$. 树上每条边的长度为$1$.我们用$d(x,y)$表示结点$x,y$在树上的距离,$LC ...
随机推荐
- Jmeter:随机类函数
一.__Random 功能介绍:计算范围内的随机数 ${__Random(参数 1,参数 2,参数 3)} 参数 1:开始数字,包括在内 参数 2:结束数字,包括在内 参数 3:注册变量名称 二._ ...
- Android Studio Gradle 输出信息乱码
Android Studio Gradle 输出信息出现乱码 如下: > Task :app:compileDebugJavaWithJavacע: ijЩ�����ļ�ʹ�û����ѹ�ʱ�� ...
- 自我介绍&学习心得
这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2023learning/join?id=CfDJ8GXQNXLgcs5PrnWvMs4xAGN4cH ...
- MySQL 学习(四)并集查询
联合查询,它是用 union 关键字把多条 select 语句的查询结果合并为一个结果集.纵向合并的前提是被合并的结果集的字段数量.顺序和数据类型必须完全一致.字段名不一样的情况下,会将第一个结果集的 ...
- linux交叉编译libiconv
1.解压libiconv-1.14.tar 2.进入解压后目录libiconv-1.14 3.执行交叉编译环境命令,例如: source /home/huhe/environment-setup-aa ...
- Django项目的创建、启动、停止
1. 首先安装Django的包 pip install Django 的命令安装包 2. 配置环境变量,必须配置,后边需要用到django的命令,这个包和别的包不太一样的地方 C:\Users**** ...
- eNSP报错41解决方法
1.点击右上角的菜单 2.工具>>注册设备,全部勾选,然后注册,就行了.
- history 添加 时间戳和ip,用户
vim /etc/profile 在文件最后加入 HISTFILESIZE=4000 # 默认保存命令是1000条,这里修改为4000条 HISTSIZE=4000 USER_IP=`who -u ...
- wpf TreeView右键选中节点弹菜单
<TreeView x:Name="CustomTreeView" Canvas.Top="1" Canvas.Bottom="1" ...
- leetcode 剑指offer小结
栈与队列 剑指 Offer 09. 用两个栈实现队列 使用两个堆栈,一个输出栈,另一个输入栈.队列入队:直接将元素压入输入栈,队列出队:如果输出栈为空,将输入栈元素压入输出栈,再将输出栈元素出栈. 查 ...